chia-explorer 0.1.6 → 0.2.1
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/README.md +151 -7
- package/dist/chips/index.d.ts +76 -0
- package/dist/chips/index.js +288 -0
- package/dist/chips/index.js.map +1 -0
- package/dist/chips/parser.d.ts +30 -0
- package/dist/chips/parser.js +208 -0
- package/dist/chips/parser.js.map +1 -0
- package/dist/chips/readme-index.d.ts +12 -0
- package/dist/chips/readme-index.js +82 -0
- package/dist/chips/readme-index.js.map +1 -0
- package/dist/github/cache.d.ts +3 -0
- package/dist/github/cache.js +18 -0
- package/dist/github/cache.js.map +1 -0
- package/dist/github/client.d.ts +5 -0
- package/dist/github/client.js +68 -0
- package/dist/github/client.js.map +1 -0
- package/dist/schemas/chips.d.ts +8 -0
- package/dist/schemas/chips.js +39 -0
- package/dist/schemas/chips.js.map +1 -0
- package/dist/server.js +12 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/chips/get-chip.d.ts +2 -0
- package/dist/tools/chips/get-chip.js +30 -0
- package/dist/tools/chips/get-chip.js.map +1 -0
- package/dist/tools/chips/list-chip-drafts.d.ts +2 -0
- package/dist/tools/chips/list-chip-drafts.js +19 -0
- package/dist/tools/chips/list-chip-drafts.js.map +1 -0
- package/dist/tools/chips/list-chips.d.ts +2 -0
- package/dist/tools/chips/list-chips.js +33 -0
- package/dist/tools/chips/list-chips.js.map +1 -0
- package/dist/tools/chips/search-chips.d.ts +2 -0
- package/dist/tools/chips/search-chips.js +31 -0
- package/dist/tools/chips/search-chips.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
const KEY_MAP = {
|
|
2
|
+
'chip number': 'number',
|
|
3
|
+
'chip-number': 'number',
|
|
4
|
+
number: 'number',
|
|
5
|
+
title: 'title',
|
|
6
|
+
description: 'description',
|
|
7
|
+
author: 'authors',
|
|
8
|
+
authors: 'authors',
|
|
9
|
+
editor: 'editors',
|
|
10
|
+
editors: 'editors',
|
|
11
|
+
'comments-uri': 'comments_uri',
|
|
12
|
+
comments_uri: 'comments_uri',
|
|
13
|
+
status: 'status',
|
|
14
|
+
category: 'category',
|
|
15
|
+
'sub-category': 'sub_category',
|
|
16
|
+
sub_category: 'sub_category',
|
|
17
|
+
type: 'type',
|
|
18
|
+
created: 'created',
|
|
19
|
+
updated: 'updated',
|
|
20
|
+
requires: 'requires',
|
|
21
|
+
replaces: 'replaces',
|
|
22
|
+
'superseded-by': 'superseded_by',
|
|
23
|
+
superseded_by: 'superseded_by',
|
|
24
|
+
};
|
|
25
|
+
function stripTablePipes(line) {
|
|
26
|
+
let s = line.trim();
|
|
27
|
+
if (s.startsWith('|'))
|
|
28
|
+
s = s.slice(1);
|
|
29
|
+
if (s.endsWith('|'))
|
|
30
|
+
s = s.slice(0, -1);
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
function isSeparatorRow(cells) {
|
|
34
|
+
if (cells.length === 0)
|
|
35
|
+
return false;
|
|
36
|
+
return cells.every((c) => /^:?-+:?$/.test(c.trim()));
|
|
37
|
+
}
|
|
38
|
+
function isBlankOrNone(value) {
|
|
39
|
+
const v = value.trim().toLowerCase();
|
|
40
|
+
return v === '' || v === 'none' || v === '-' || v === 'n/a';
|
|
41
|
+
}
|
|
42
|
+
export function parseAuthors(raw) {
|
|
43
|
+
const trimmed = raw.trim();
|
|
44
|
+
if (isBlankOrNone(trimmed))
|
|
45
|
+
return [];
|
|
46
|
+
const out = [];
|
|
47
|
+
const linkPattern = /\[([^\]]+)\]\(([^)]+)\)/g;
|
|
48
|
+
const seen = [];
|
|
49
|
+
let match;
|
|
50
|
+
while ((match = linkPattern.exec(trimmed)) !== null) {
|
|
51
|
+
out.push({ name: match[1].trim(), url: match[2].trim() });
|
|
52
|
+
seen.push({ start: match.index, end: match.index + match[0].length });
|
|
53
|
+
}
|
|
54
|
+
if (out.length > 0)
|
|
55
|
+
return out;
|
|
56
|
+
for (const part of trimmed.split(',')) {
|
|
57
|
+
const name = part.trim();
|
|
58
|
+
if (name)
|
|
59
|
+
out.push({ name, url: null });
|
|
60
|
+
}
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
function parseChipNumber(raw) {
|
|
64
|
+
const m = raw.trim().match(/^\d+/);
|
|
65
|
+
if (!m)
|
|
66
|
+
return null;
|
|
67
|
+
const n = Number(m[0]);
|
|
68
|
+
return Number.isFinite(n) ? n : null;
|
|
69
|
+
}
|
|
70
|
+
function assignField(fm, field, value) {
|
|
71
|
+
switch (field) {
|
|
72
|
+
case 'number':
|
|
73
|
+
fm.number = parseChipNumber(value);
|
|
74
|
+
return;
|
|
75
|
+
case 'authors':
|
|
76
|
+
fm.authors = parseAuthors(value);
|
|
77
|
+
return;
|
|
78
|
+
case 'editors':
|
|
79
|
+
fm.editors = parseAuthors(value);
|
|
80
|
+
return;
|
|
81
|
+
case 'extra':
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const normalized = isBlankOrNone(value) ? null : value;
|
|
85
|
+
switch (field) {
|
|
86
|
+
case 'title':
|
|
87
|
+
fm.title = normalized;
|
|
88
|
+
return;
|
|
89
|
+
case 'description':
|
|
90
|
+
fm.description = normalized;
|
|
91
|
+
return;
|
|
92
|
+
case 'comments_uri':
|
|
93
|
+
fm.comments_uri = normalized;
|
|
94
|
+
return;
|
|
95
|
+
case 'status':
|
|
96
|
+
fm.status = normalized;
|
|
97
|
+
return;
|
|
98
|
+
case 'category':
|
|
99
|
+
fm.category = normalized;
|
|
100
|
+
return;
|
|
101
|
+
case 'sub_category':
|
|
102
|
+
fm.sub_category = normalized;
|
|
103
|
+
return;
|
|
104
|
+
case 'type':
|
|
105
|
+
fm.type = normalized;
|
|
106
|
+
return;
|
|
107
|
+
case 'created':
|
|
108
|
+
fm.created = normalized;
|
|
109
|
+
return;
|
|
110
|
+
case 'updated':
|
|
111
|
+
fm.updated = normalized;
|
|
112
|
+
return;
|
|
113
|
+
case 'requires':
|
|
114
|
+
fm.requires = normalized;
|
|
115
|
+
return;
|
|
116
|
+
case 'replaces':
|
|
117
|
+
fm.replaces = normalized;
|
|
118
|
+
return;
|
|
119
|
+
case 'superseded_by':
|
|
120
|
+
fm.superseded_by = normalized;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function emptyFrontMatter() {
|
|
125
|
+
return {
|
|
126
|
+
number: null,
|
|
127
|
+
title: null,
|
|
128
|
+
description: null,
|
|
129
|
+
authors: [],
|
|
130
|
+
editors: [],
|
|
131
|
+
comments_uri: null,
|
|
132
|
+
status: null,
|
|
133
|
+
category: null,
|
|
134
|
+
sub_category: null,
|
|
135
|
+
type: null,
|
|
136
|
+
created: null,
|
|
137
|
+
updated: null,
|
|
138
|
+
requires: null,
|
|
139
|
+
replaces: null,
|
|
140
|
+
superseded_by: null,
|
|
141
|
+
extra: {},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export function parseChipFrontMatter(markdown) {
|
|
145
|
+
const fm = emptyFrontMatter();
|
|
146
|
+
const lines = markdown.split(/\r?\n/);
|
|
147
|
+
for (const raw of lines) {
|
|
148
|
+
if (/^##\s/.test(raw))
|
|
149
|
+
break;
|
|
150
|
+
if (/^#\s/.test(raw))
|
|
151
|
+
continue;
|
|
152
|
+
const trimmed = raw.trim();
|
|
153
|
+
if (!trimmed)
|
|
154
|
+
continue;
|
|
155
|
+
if (!trimmed.includes('|'))
|
|
156
|
+
continue;
|
|
157
|
+
const cells = stripTablePipes(trimmed)
|
|
158
|
+
.split('|')
|
|
159
|
+
.map((c) => c.trim());
|
|
160
|
+
if (cells.length < 2)
|
|
161
|
+
continue;
|
|
162
|
+
if (isSeparatorRow(cells))
|
|
163
|
+
continue;
|
|
164
|
+
const key = cells[0].toLowerCase();
|
|
165
|
+
const value = cells.slice(1).join('|').trim();
|
|
166
|
+
const mapped = KEY_MAP[key];
|
|
167
|
+
if (!mapped) {
|
|
168
|
+
if (key)
|
|
169
|
+
fm.extra[key] = value;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
assignField(fm, mapped, value);
|
|
173
|
+
}
|
|
174
|
+
return fm;
|
|
175
|
+
}
|
|
176
|
+
export function extractAbstract(markdown) {
|
|
177
|
+
const lines = markdown.split(/\r?\n/);
|
|
178
|
+
let i = 0;
|
|
179
|
+
while (i < lines.length) {
|
|
180
|
+
if (/^##\s+abstract\s*$/i.test(lines[i].trim()))
|
|
181
|
+
break;
|
|
182
|
+
i++;
|
|
183
|
+
}
|
|
184
|
+
if (i >= lines.length)
|
|
185
|
+
return null;
|
|
186
|
+
i++;
|
|
187
|
+
const buf = [];
|
|
188
|
+
while (i < lines.length) {
|
|
189
|
+
const line = lines[i];
|
|
190
|
+
if (/^#{1,6}\s/.test(line.trim()))
|
|
191
|
+
break;
|
|
192
|
+
buf.push(line);
|
|
193
|
+
i++;
|
|
194
|
+
}
|
|
195
|
+
const text = buf.join('\n').trim();
|
|
196
|
+
return text || null;
|
|
197
|
+
}
|
|
198
|
+
export function buildChipFileName(number) {
|
|
199
|
+
return `chip-${String(number).padStart(4, '0')}.md`;
|
|
200
|
+
}
|
|
201
|
+
const CHIP_FILE_PATTERN = /CHIPs\/chip-(\d{1,5})\.md$/i;
|
|
202
|
+
export function extractChipPathInfo(path) {
|
|
203
|
+
const m = CHIP_FILE_PATTERN.exec(path);
|
|
204
|
+
if (!m)
|
|
205
|
+
return null;
|
|
206
|
+
return { number: Number(m[1]), filename: path };
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/chips/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ChipReadmeEntryKind = 'file' | 'pr' | 'external';
|
|
2
|
+
export interface ChipReadmeEntry {
|
|
3
|
+
number: number | null;
|
|
4
|
+
title: string;
|
|
5
|
+
status: string;
|
|
6
|
+
url: string;
|
|
7
|
+
kind: ChipReadmeEntryKind;
|
|
8
|
+
filename: string | null;
|
|
9
|
+
prNumber: number | null;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseChipReadmeIndex(markdown: string): ChipReadmeEntry[];
|
|
12
|
+
export declare function getChipReadmeIndex(): Promise<ChipReadmeEntry[]>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { fetchRawFile } from '../github/client.js';
|
|
2
|
+
import { getCached } from '../github/cache.js';
|
|
3
|
+
const REPO = 'Chia-Network/chips';
|
|
4
|
+
const DEFAULT_REF = 'main';
|
|
5
|
+
const README_PATH = 'README.md';
|
|
6
|
+
const README_TTL_MS = 5 * 60_000;
|
|
7
|
+
const BULLET_PATTERN = /^\*\s+\[(.+?)\]\((.+?)\)/;
|
|
8
|
+
const FILE_LINK_PATTERN = /^\/?CHIPs\/(chip-\d{1,5}\.md)$/i;
|
|
9
|
+
const PR_LINK_PATTERN = /^https?:\/\/github\.com\/Chia-Network\/chips\/pull\/(\d+)\/?$/i;
|
|
10
|
+
function parseLabel(label) {
|
|
11
|
+
const m = label.match(/^\s*(\d+)\s*[-–—:]\s*(.+?)\s*$/);
|
|
12
|
+
if (m) {
|
|
13
|
+
return { number: Number(m[1]), title: m[2].trim() };
|
|
14
|
+
}
|
|
15
|
+
return { number: null, title: label.trim() };
|
|
16
|
+
}
|
|
17
|
+
function classify(url) {
|
|
18
|
+
const fileMatch = url.match(FILE_LINK_PATTERN);
|
|
19
|
+
if (fileMatch) {
|
|
20
|
+
const filename = `CHIPs/${fileMatch[1]}`;
|
|
21
|
+
return {
|
|
22
|
+
kind: 'file',
|
|
23
|
+
filename,
|
|
24
|
+
prNumber: null,
|
|
25
|
+
absoluteUrl: `https://github.com/${REPO}/blob/${DEFAULT_REF}/${filename}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const prMatch = url.match(PR_LINK_PATTERN);
|
|
29
|
+
if (prMatch) {
|
|
30
|
+
return {
|
|
31
|
+
kind: 'pr',
|
|
32
|
+
filename: null,
|
|
33
|
+
prNumber: Number(prMatch[1]),
|
|
34
|
+
absoluteUrl: url,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return { kind: 'external', filename: null, prNumber: null, absoluteUrl: url };
|
|
38
|
+
}
|
|
39
|
+
export function parseChipReadmeIndex(markdown) {
|
|
40
|
+
const lines = markdown.split(/\r?\n/);
|
|
41
|
+
const entries = [];
|
|
42
|
+
let currentStatus = null;
|
|
43
|
+
for (const raw of lines) {
|
|
44
|
+
const line = raw.trim();
|
|
45
|
+
const heading = line.match(/^###\s+(.+?)\s*$/);
|
|
46
|
+
if (heading) {
|
|
47
|
+
currentStatus = heading[1].trim();
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (line.startsWith('## ')) {
|
|
51
|
+
currentStatus = null;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (!currentStatus)
|
|
55
|
+
continue;
|
|
56
|
+
const bullet = line.match(BULLET_PATTERN);
|
|
57
|
+
if (!bullet)
|
|
58
|
+
continue;
|
|
59
|
+
const [, label, url] = bullet;
|
|
60
|
+
if (!label || !url)
|
|
61
|
+
continue;
|
|
62
|
+
const { number, title } = parseLabel(label);
|
|
63
|
+
const { kind, filename, prNumber, absoluteUrl } = classify(url);
|
|
64
|
+
entries.push({
|
|
65
|
+
number,
|
|
66
|
+
title,
|
|
67
|
+
status: currentStatus,
|
|
68
|
+
url: absoluteUrl,
|
|
69
|
+
kind,
|
|
70
|
+
filename,
|
|
71
|
+
prNumber,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return entries;
|
|
75
|
+
}
|
|
76
|
+
export async function getChipReadmeIndex() {
|
|
77
|
+
return getCached(`chips:readme:${DEFAULT_REF}`, async () => {
|
|
78
|
+
const body = await fetchRawFile(REPO, DEFAULT_REF, README_PATH);
|
|
79
|
+
return parseChipReadmeIndex(body);
|
|
80
|
+
}, README_TTL_MS);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=readme-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readme-index.js","sourceRoot":"","sources":["../../src/chips/readme-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const DEFAULT_TTL_MS = 5 * 60_000;
|
|
2
|
+
const cache = new Map();
|
|
3
|
+
export async function getCached(key, loader, ttlMs = DEFAULT_TTL_MS) {
|
|
4
|
+
const now = Date.now();
|
|
5
|
+
const entry = cache.get(key);
|
|
6
|
+
if (entry && entry.expiresAt > now)
|
|
7
|
+
return entry.value;
|
|
8
|
+
const value = await loader();
|
|
9
|
+
cache.set(key, { value, expiresAt: now + ttlMs });
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
export function invalidate(key) {
|
|
13
|
+
cache.delete(key);
|
|
14
|
+
}
|
|
15
|
+
export function resetCache() {
|
|
16
|
+
cache.clear();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/github/cache.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC;AAOlC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,MAAwB,EACxB,QAAgB,cAAc;IAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAyB,CAAC;IACrD,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;IAC7B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const GITHUB_API_BASE = 'https://api.github.com';
|
|
2
|
+
const RAW_BASE = 'https://raw.githubusercontent.com';
|
|
3
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
4
|
+
const USER_AGENT = 'chia-explorer-mcp';
|
|
5
|
+
function authHeaders() {
|
|
6
|
+
const headers = {
|
|
7
|
+
accept: 'application/vnd.github+json',
|
|
8
|
+
'x-github-api-version': '2022-11-28',
|
|
9
|
+
'user-agent': USER_AGENT,
|
|
10
|
+
};
|
|
11
|
+
const token = process.env.GITHUB_TOKEN;
|
|
12
|
+
if (token)
|
|
13
|
+
headers['authorization'] = `Bearer ${token}`;
|
|
14
|
+
return headers;
|
|
15
|
+
}
|
|
16
|
+
function rateLimitMessage(res, body) {
|
|
17
|
+
if (res.status !== 403 && res.status !== 429)
|
|
18
|
+
return null;
|
|
19
|
+
const remaining = res.headers.get('x-ratelimit-remaining');
|
|
20
|
+
const reset = res.headers.get('x-ratelimit-reset');
|
|
21
|
+
if (remaining === '0' || /rate limit/i.test(body)) {
|
|
22
|
+
const resetAt = reset ? new Date(Number(reset) * 1000).toISOString() : 'unknown';
|
|
23
|
+
const tokenHint = process.env.GITHUB_TOKEN
|
|
24
|
+
? ''
|
|
25
|
+
: ' Set GITHUB_TOKEN to raise the limit from 60/hr to 5000/hr.';
|
|
26
|
+
return `github rate limit exhausted (resets at ${resetAt}).${tokenHint}`;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
export async function githubApi(path) {
|
|
31
|
+
const url = path.startsWith('http') ? path : `${GITHUB_API_BASE}${path}`;
|
|
32
|
+
const res = await fetch(url, {
|
|
33
|
+
headers: authHeaders(),
|
|
34
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
35
|
+
});
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
const body = await res.text().catch(() => '');
|
|
38
|
+
const rateLimit = rateLimitMessage(res, body);
|
|
39
|
+
if (rateLimit)
|
|
40
|
+
throw new Error(rateLimit);
|
|
41
|
+
const detail = body ? `: ${body.slice(0, 200)}` : '';
|
|
42
|
+
throw new Error(`github ${res.status} ${res.statusText}${detail}`);
|
|
43
|
+
}
|
|
44
|
+
return (await res.json());
|
|
45
|
+
}
|
|
46
|
+
export async function fetchRawFile(repo, ref, path) {
|
|
47
|
+
const url = `${RAW_BASE}/${repo}/${ref}/${path}`;
|
|
48
|
+
const res = await fetch(url, {
|
|
49
|
+
headers: { 'user-agent': USER_AGENT },
|
|
50
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
51
|
+
});
|
|
52
|
+
if (res.status === 404) {
|
|
53
|
+
throw new FileNotFoundError(`raw file not found: ${repo}@${ref}/${path}`);
|
|
54
|
+
}
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
const body = await res.text().catch(() => '');
|
|
57
|
+
const detail = body ? `: ${body.slice(0, 200)}` : '';
|
|
58
|
+
throw new Error(`raw.githubusercontent ${res.status} ${res.statusText}${detail}`);
|
|
59
|
+
}
|
|
60
|
+
return await res.text();
|
|
61
|
+
}
|
|
62
|
+
export class FileNotFoundError extends Error {
|
|
63
|
+
constructor(message) {
|
|
64
|
+
super(message);
|
|
65
|
+
this.name = 'FileNotFoundError';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const chipNumberSchema: z.ZodPipeline<z.ZodEffects<z.ZodUnion<[z.ZodNumber, z.ZodString]>, number, string | number>, z.ZodNumber>;
|
|
3
|
+
export declare const chipStatusFilterSchema: z.ZodOptional<z.ZodString>;
|
|
4
|
+
export declare const chipCategoryFilterSchema: z.ZodOptional<z.ZodString>;
|
|
5
|
+
export declare const includeBodySchema: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
+
export declare const searchQuerySchema: z.ZodString;
|
|
7
|
+
export declare const searchSourceSchema: z.ZodDefault<z.ZodEnum<["merged", "draft", "both"]>>;
|
|
8
|
+
export declare const searchLimitSchema: z.ZodDefault<z.ZodNumber>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const chipNumberSchema = z
|
|
3
|
+
.union([z.number().int().nonnegative(), z.string().regex(/^\d+$/)])
|
|
4
|
+
.transform((v) => (typeof v === 'string' ? Number(v) : v))
|
|
5
|
+
.pipe(z.number().int().min(0).max(99999))
|
|
6
|
+
.describe('CHIP number, e.g. 42 or "0042". Accepts the integer or a zero-padded string.');
|
|
7
|
+
export const chipStatusFilterSchema = z
|
|
8
|
+
.string()
|
|
9
|
+
.min(1)
|
|
10
|
+
.max(40)
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("Restrict to a status, e.g. 'Final', 'Review', 'Draft', 'Last Call', 'Living', 'Stagnant', 'Withdrawn', 'Obsolete'. Case-insensitive.");
|
|
13
|
+
export const chipCategoryFilterSchema = z
|
|
14
|
+
.string()
|
|
15
|
+
.min(1)
|
|
16
|
+
.max(40)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Restrict to a category, e.g. 'Standards Track', 'Process', 'Informational'. Case-insensitive.");
|
|
19
|
+
export const includeBodySchema = z
|
|
20
|
+
.boolean()
|
|
21
|
+
.default(false)
|
|
22
|
+
.describe('If true, include the full markdown body of the CHIP. Defaults to false.');
|
|
23
|
+
export const searchQuerySchema = z
|
|
24
|
+
.string()
|
|
25
|
+
.min(1)
|
|
26
|
+
.max(200)
|
|
27
|
+
.describe('Case-insensitive keyword matched against title, description, abstract, and authors.');
|
|
28
|
+
export const searchSourceSchema = z
|
|
29
|
+
.enum(['merged', 'draft', 'both'])
|
|
30
|
+
.default('both')
|
|
31
|
+
.describe("Where to search: 'merged' (CHIPs on main), 'draft' (open PRs), or 'both' (default).");
|
|
32
|
+
export const searchLimitSchema = z
|
|
33
|
+
.number()
|
|
34
|
+
.int()
|
|
35
|
+
.positive()
|
|
36
|
+
.max(100)
|
|
37
|
+
.default(20)
|
|
38
|
+
.describe('Maximum results. Default 20, max 100.');
|
|
39
|
+
//# sourceMappingURL=chips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chips.js","sourceRoot":"","sources":["../../src/schemas/chips.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAClE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACzD,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACxC,QAAQ,CAAC,8EAA8E,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,EAAE,CAAC;KACP,QAAQ,EAAE;KACV,QAAQ,CACP,sIAAsI,CACvI,CAAC;AAEJ,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,EAAE,CAAC;KACP,QAAQ,EAAE;KACV,QAAQ,CACP,+FAA+F,CAChG,CAAC;AAEJ,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,OAAO,EAAE;KACT,OAAO,CAAC,KAAK,CAAC;KACd,QAAQ,CAAC,yEAAyE,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,GAAG,CAAC;KACR,QAAQ,CAAC,qFAAqF,CAAC,CAAC;AAEnG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;KACjC,OAAO,CAAC,MAAM,CAAC;KACf,QAAQ,CAAC,qFAAqF,CAAC,CAAC;AAEnG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,EAAE;KACR,GAAG,EAAE;KACL,QAAQ,EAAE;KACV,GAAG,CAAC,GAAG,CAAC;KACR,OAAO,CAAC,EAAE,CAAC;KACX,QAAQ,CAAC,uCAAuC,CAAC,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -26,6 +26,10 @@ import { register as registerDecompilePuzzle } from './tools/offers/decompile-pu
|
|
|
26
26
|
import { register as registerGetMempool } from './tools/mempool/get-mempool.js';
|
|
27
27
|
import { register as registerIsInMempool } from './tools/mempool/is-in-mempool.js';
|
|
28
28
|
import { register as registerEstimateFee } from './tools/mempool/estimate-fee.js';
|
|
29
|
+
import { register as registerListChips } from './tools/chips/list-chips.js';
|
|
30
|
+
import { register as registerGetChip } from './tools/chips/get-chip.js';
|
|
31
|
+
import { register as registerListChipDrafts } from './tools/chips/list-chip-drafts.js';
|
|
32
|
+
import { register as registerSearchChips } from './tools/chips/search-chips.js';
|
|
29
33
|
import { register as registerNetworkStatusPrompt } from './prompts/network-status.js';
|
|
30
34
|
import { register as registerAddressSummaryPrompt } from './prompts/address-summary.js';
|
|
31
35
|
import { register as registerBlockSummaryPrompt } from './prompts/block-summary.js';
|
|
@@ -33,11 +37,13 @@ import { register as registerPrefarmSummaryPrompt } from './prompts/prefarm-summ
|
|
|
33
37
|
export function createServer() {
|
|
34
38
|
const server = new McpServer({ name: 'chia-explorer', version: VERSION }, {
|
|
35
39
|
instructions: 'chia-explorer answers questions about the Chia blockchain via the public coinset.org API, ' +
|
|
36
|
-
'plus XCH spot price and fiat conversion via the public CoinGecko API
|
|
40
|
+
'plus XCH spot price and fiat conversion via the public CoinGecko API, ' +
|
|
41
|
+
'plus Chia Improvement Proposals (CHIPs) read directly from the Chia-Network/chips GitHub repo (merged on main and open PR drafts). ' +
|
|
37
42
|
'Read-only: no signing, no key material, no push_tx. ' +
|
|
38
43
|
"Blockchain tools accept an optional `network: 'mainnet' | 'testnet11'` argument; mainnet is the default. " +
|
|
39
44
|
'When an address is provided, the network is auto-detected from the prefix (xch / txch). ' +
|
|
40
|
-
'Price tools take no network argument.'
|
|
45
|
+
'Price and CHIPs tools take no network argument. ' +
|
|
46
|
+
'An optional GITHUB_TOKEN env var lifts the unauthenticated GitHub rate limit on CHIPs listings.',
|
|
41
47
|
});
|
|
42
48
|
registerGetBlockchainState(server);
|
|
43
49
|
registerGetNetspace(server);
|
|
@@ -65,6 +71,10 @@ export function createServer() {
|
|
|
65
71
|
registerGetMempool(server);
|
|
66
72
|
registerIsInMempool(server);
|
|
67
73
|
registerEstimateFee(server);
|
|
74
|
+
registerListChips(server);
|
|
75
|
+
registerGetChip(server);
|
|
76
|
+
registerListChipDrafts(server);
|
|
77
|
+
registerSearchChips(server);
|
|
68
78
|
registerNetworkStatusPrompt(server);
|
|
69
79
|
registerAddressSummaryPrompt(server);
|
|
70
80
|
registerBlockSummaryPrompt(server);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACpG,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACjG,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,8BAA8B,EAAE,MAAM,gDAAgD,CAAC;AAC5G,OAAO,EAAE,QAAQ,IAAI,oCAAoC,EAAE,MAAM,wDAAwD,CAAC;AAE1H,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,kCAAkC,EAAE,MAAM,kDAAkD,CAAC;AAClH,OAAO,EAAE,QAAQ,IAAI,iCAAiC,EAAE,MAAM,iDAAiD,CAAC;AAChH,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAEpG,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AACtG,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAEtG,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAE5F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAErG,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAAE,QAAQ,IAAI,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAEzF,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAElF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAExF,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAC3C;QACE,YAAY,EACV,4FAA4F;YAC5F,wEAAwE;YACxE,sDAAsD;YACtD,2GAA2G;YAC3G,0FAA0F;YAC1F,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { findChipByNumber } from '../../chips/index.js';
|
|
2
|
+
import { chipNumberSchema, includeBodySchema } from '../../schemas/chips.js';
|
|
3
|
+
import { errorText, jsonText } from '../shared/response.js';
|
|
4
|
+
export function register(server) {
|
|
5
|
+
server.tool('get_chip', 'Get a single CHIP by number. Looks first on main (merged) and also surfaces any open PRs proposing changes to the same number. Returns parsed front matter, abstract, source URL, and (with include_body=true) the full markdown body.', {
|
|
6
|
+
number: chipNumberSchema,
|
|
7
|
+
include_body: includeBodySchema,
|
|
8
|
+
}, async ({ number, include_body }) => {
|
|
9
|
+
try {
|
|
10
|
+
const { merged, drafts } = await findChipByNumber(number, { includeBody: include_body });
|
|
11
|
+
if (!merged && drafts.length === 0) {
|
|
12
|
+
return jsonText({
|
|
13
|
+
number,
|
|
14
|
+
found: false,
|
|
15
|
+
message: `no CHIP ${number} on main or in open PRs`,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return jsonText({
|
|
19
|
+
number,
|
|
20
|
+
found: true,
|
|
21
|
+
merged,
|
|
22
|
+
drafts,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return errorText(err);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=get-chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-chip.js","sourceRoot":"","sources":["../../../src/tools/chips/get-chip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,UAAU,EACV,wOAAwO,EACxO;QACE,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,iBAAiB;KAChC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,QAAQ,CAAC;oBACd,MAAM;oBACN,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,WAAW,MAAM,yBAAyB;iBACpD,CAAC,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC;gBACd,MAAM;gBACN,KAAK,EAAE,IAAI;gBACX,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { listChipDrafts } from '../../chips/index.js';
|
|
2
|
+
import { errorText, jsonText } from '../shared/response.js';
|
|
3
|
+
export function register(server) {
|
|
4
|
+
server.tool('list_chip_drafts', 'List the live state of every open pull request against Chia-Network/chips that adds or modifies a CHIP file. Use this for PR review context (author, requested reviewers, draft flag, updated_at) and the modifies_existing flag for amendments. PRs that do not touch a CHIPs/chip-*.md file are filtered out. For the canonical CHIP index across all statuses (including Draft proposals), use list_chips.', {}, async () => {
|
|
5
|
+
try {
|
|
6
|
+
const drafts = await listChipDrafts();
|
|
7
|
+
return jsonText({
|
|
8
|
+
source: 'github',
|
|
9
|
+
repo: 'Chia-Network/chips',
|
|
10
|
+
count: drafts.length,
|
|
11
|
+
drafts,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
return errorText(err);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=list-chip-drafts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-chip-drafts.js","sourceRoot":"","sources":["../../../src/tools/chips/list-chip-drafts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,+YAA+Y,EAC/Y,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;YACtC,OAAO,QAAQ,CAAC;gBACd,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|