@adaptabletools/adaptable-mcp 0.1.0-canary.0 → 0.1.0-canary.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 +56 -61
- package/data/manifest.snapshot.json +184 -0
- package/dist/bin.js +16 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/build-commands.js +200 -0
- package/dist/cli/build-commands.js.map +1 -0
- package/dist/cli/index.js +86 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/render.js +57 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/core/capabilities.js +99 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/compat/capabilities.js +127 -0
- package/dist/core/compat/capabilities.js.map +1 -0
- package/dist/core/compat/manifest.js +203 -0
- package/dist/core/compat/manifest.js.map +1 -0
- package/dist/core/constants.js +38 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/context/capabilities.js +106 -0
- package/dist/core/context/capabilities.js.map +1 -0
- package/dist/core/context/detect.js +370 -0
- package/dist/core/context/detect.js.map +1 -0
- package/dist/core/context/projects.js +159 -0
- package/dist/core/context/projects.js.map +1 -0
- package/dist/core/context/resolve.js +85 -0
- package/dist/core/context/resolve.js.map +1 -0
- package/dist/core/docs/areas.js +22 -0
- package/dist/core/docs/areas.js.map +1 -0
- package/dist/core/docs/cache.js +133 -0
- package/dist/core/docs/cache.js.map +1 -0
- package/dist/core/docs/capabilities.js +381 -0
- package/dist/core/docs/capabilities.js.map +1 -0
- package/dist/core/docs/corpus.js.map +1 -0
- package/dist/core/docs/demos.js +105 -0
- package/dist/core/docs/demos.js.map +1 -0
- package/dist/core/docs/get-page.js +182 -0
- package/dist/core/docs/get-page.js.map +1 -0
- package/dist/core/docs/hosts.js +74 -0
- package/dist/core/docs/hosts.js.map +1 -0
- package/dist/core/docs/search.js.map +1 -0
- package/dist/core/envelope.js +79 -0
- package/dist/core/envelope.js.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/packages/cache.js +138 -0
- package/dist/core/packages/cache.js.map +1 -0
- package/dist/core/packages/capabilities.js +95 -0
- package/dist/core/packages/capabilities.js.map +1 -0
- package/dist/{adaptable/types.js → core/packages/entry-types.js} +1 -1
- package/dist/core/packages/entry-types.js.map +1 -0
- package/dist/core/packages/exec.js +37 -0
- package/dist/core/packages/exec.js.map +1 -0
- package/dist/core/packages/load-entry.js +123 -0
- package/dist/core/packages/load-entry.js.map +1 -0
- package/dist/core/packages/prepare.js +122 -0
- package/dist/core/packages/prepare.js.map +1 -0
- package/dist/core/packages/registry.js +75 -0
- package/dist/core/packages/registry.js.map +1 -0
- package/dist/core/packages/resolve.js +94 -0
- package/dist/core/packages/resolve.js.map +1 -0
- package/dist/core/packages/versions.js +71 -0
- package/dist/core/packages/versions.js.map +1 -0
- package/dist/core/ping.js +22 -0
- package/dist/core/ping.js.map +1 -0
- package/dist/core/register.js +10 -0
- package/dist/core/register.js.map +1 -0
- package/dist/{checks/stateRules.js → core/state/rules.js} +29 -1
- package/dist/core/state/rules.js.map +1 -0
- package/dist/{checks/stateTypes.js → core/state/type-check.js} +1 -1
- package/dist/core/state/type-check.js.map +1 -0
- package/dist/mcp/index.js +21 -0
- package/dist/mcp/index.js.map +1 -0
- package/package.json +27 -12
- package/dist/adaptable/loadEntry.js +0 -94
- package/dist/adaptable/loadEntry.js.map +0 -1
- package/dist/adaptable/types.js.map +0 -1
- package/dist/cache.js +0 -11
- package/dist/cache.js.map +0 -1
- package/dist/checks/stateRules.js.map +0 -1
- package/dist/checks/stateTypes.js.map +0 -1
- package/dist/context.js +0 -39
- package/dist/context.js.map +0 -1
- package/dist/docs/corpus.js.map +0 -1
- package/dist/docs/search.js.map +0 -1
- package/dist/docs/source.js +0 -151
- package/dist/docs/source.js.map +0 -1
- package/dist/environment.js +0 -181
- package/dist/environment.js.map +0 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/prompts.js +0 -84
- package/dist/prompts.js.map +0 -1
- package/dist/resources.js +0 -59
- package/dist/resources.js.map +0 -1
- package/dist/server.js +0 -23
- package/dist/server.js.map +0 -1
- package/dist/tools/checks.js +0 -250
- package/dist/tools/checks.js.map +0 -1
- package/dist/tools/docs.js +0 -173
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/environment.js +0 -52
- package/dist/tools/environment.js.map +0 -1
- package/skills/adaptable-dev/SKILL.md +0 -42
- /package/dist/{docs → core/docs}/corpus.js +0 -0
- /package/dist/{docs → core/docs}/search.js +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/** Accepts a slug, a route path or a docs URL (with or without `.md` / `/index.md`) */
|
|
2
|
+
export function findPage(corpus, page) {
|
|
3
|
+
const routePath = page
|
|
4
|
+
.trim()
|
|
5
|
+
.replace(/^https?:\/\/[^/]+/, '')
|
|
6
|
+
.replace(/[?#].*$/, '')
|
|
7
|
+
.replace(/\/index\.md$|\.md$/, '')
|
|
8
|
+
.replace(/\/+$/, '');
|
|
9
|
+
const candidates = /^\/(docs|support)(\/|$)/.test(routePath)
|
|
10
|
+
? [routePath]
|
|
11
|
+
: [`/docs/${routePath}`, `/docs/reference/${routePath.toLowerCase()}`, `/support/${routePath}`];
|
|
12
|
+
for (const candidate of candidates) {
|
|
13
|
+
const found = corpus.pages.get(candidate) ?? corpus.pages.get(candidate.toLowerCase());
|
|
14
|
+
if (found) {
|
|
15
|
+
return found;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/** The slug skills use: the route path without `/docs/` (`/support/...` keeps its prefix) */
|
|
21
|
+
export const slugOf = (routePath) => routePath.replace(/^\/docs\//, '');
|
|
22
|
+
/**
|
|
23
|
+
* Closest slugs for a request that matched no page: slugs or titles sharing
|
|
24
|
+
* words with the request, then the search index's best sections.
|
|
25
|
+
*/
|
|
26
|
+
export function suggestSlugs(corpus, request, limit = 5) {
|
|
27
|
+
const words = request
|
|
28
|
+
.toLowerCase()
|
|
29
|
+
.replace(/^https?:\/\/[^/]+/, '')
|
|
30
|
+
.split(/[^a-z0-9]+/)
|
|
31
|
+
.filter((w) => w.length >= 3 && w !== 'docs');
|
|
32
|
+
const scored = [];
|
|
33
|
+
for (const page of corpus.pages.values()) {
|
|
34
|
+
const slug = slugOf(page.routePath);
|
|
35
|
+
const haystack = `${slug} ${page.title}`.toLowerCase();
|
|
36
|
+
let score = 0;
|
|
37
|
+
for (const word of words) {
|
|
38
|
+
if (haystack.includes(word)) {
|
|
39
|
+
score += word.length;
|
|
40
|
+
}
|
|
41
|
+
else if (word.length >= 5 && haystack.includes(word.slice(0, -1))) {
|
|
42
|
+
score += word.length - 2; // one trailing character off (`layoutz`)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (score > 0) {
|
|
46
|
+
scored.push({ slug, score });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const bySlug = scored.sort((a, b) => b.score - a.score || a.slug.localeCompare(b.slug)).map((s) => s.slug);
|
|
50
|
+
const byIndex = corpus.index.search(words.join(' '), { limit }).map((h) => slugOf(h.section.routePath));
|
|
51
|
+
return [...new Set([...bySlug, ...byIndex])].slice(0, limit);
|
|
52
|
+
}
|
|
53
|
+
const FENCE = /^\s*(```|~~~)/;
|
|
54
|
+
const HEADING = /^(#{1,6})\s+(.+?)\s*#*\s*$/;
|
|
55
|
+
function parseLines(markdown) {
|
|
56
|
+
let inFence = false;
|
|
57
|
+
return markdown.split('\n').map((text) => {
|
|
58
|
+
if (FENCE.test(text)) {
|
|
59
|
+
inFence = !inFence;
|
|
60
|
+
return { text };
|
|
61
|
+
}
|
|
62
|
+
if (inFence) {
|
|
63
|
+
return { text };
|
|
64
|
+
}
|
|
65
|
+
const match = text.match(HEADING);
|
|
66
|
+
return match ? { text, level: match[1].length, heading: match[2] } : { text };
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** The section under the first heading containing `heading` (case-insensitive), up to the next heading of the same or a higher level */
|
|
70
|
+
export function extractHeading(markdown, heading) {
|
|
71
|
+
const lines = parseLines(markdown);
|
|
72
|
+
const target = heading.trim().toLowerCase();
|
|
73
|
+
let start = -1;
|
|
74
|
+
let level = 0;
|
|
75
|
+
for (let i = 0; i < lines.length; i++) {
|
|
76
|
+
const line = lines[i];
|
|
77
|
+
if (line.level === undefined) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (start < 0 && line.heading.toLowerCase().includes(target)) {
|
|
81
|
+
start = i;
|
|
82
|
+
level = line.level;
|
|
83
|
+
}
|
|
84
|
+
else if (start >= 0 && line.level <= level) {
|
|
85
|
+
return lines
|
|
86
|
+
.slice(start, i)
|
|
87
|
+
.map((l) => l.text)
|
|
88
|
+
.join('\n')
|
|
89
|
+
.trimEnd();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return start >= 0
|
|
93
|
+
? lines
|
|
94
|
+
.slice(start)
|
|
95
|
+
.map((l) => l.text)
|
|
96
|
+
.join('\n')
|
|
97
|
+
.trimEnd()
|
|
98
|
+
: undefined;
|
|
99
|
+
}
|
|
100
|
+
/** The page's `##`–`####` headings, skipping code fences */
|
|
101
|
+
export function outline(markdown) {
|
|
102
|
+
return parseLines(markdown)
|
|
103
|
+
.filter((l) => l.level !== undefined && l.level >= 2 && l.level <= 4)
|
|
104
|
+
.map((l) => l.text);
|
|
105
|
+
}
|
|
106
|
+
/** Rough token count (≈ 4 characters per token) */
|
|
107
|
+
export const estimateTokens = (text) => Math.ceil(text.length / 4);
|
|
108
|
+
const DEMO_START = /^Demo project \(([^)]+)\);?/;
|
|
109
|
+
/**
|
|
110
|
+
* Replaces every embedded demo (the "Demo project (…)" paragraph, its file tree and
|
|
111
|
+
* the per-file code blocks, up to the next heading) with one line naming the demo's
|
|
112
|
+
* own files, so a page costs a fraction of its tokens; `docs demo` returns the code.
|
|
113
|
+
*/
|
|
114
|
+
export function trimDemos(markdown) {
|
|
115
|
+
const lines = parseLines(markdown);
|
|
116
|
+
const out = [];
|
|
117
|
+
let trimmed = 0;
|
|
118
|
+
for (let i = 0; i < lines.length; i++) {
|
|
119
|
+
const start = lines[i].text.match(DEMO_START);
|
|
120
|
+
if (!start) {
|
|
121
|
+
out.push(lines[i].text);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// collect until the next heading
|
|
125
|
+
let end = i + 1;
|
|
126
|
+
while (end < lines.length && lines[end].level === undefined) {
|
|
127
|
+
end++;
|
|
128
|
+
}
|
|
129
|
+
const block = lines.slice(i, end).map((l) => l.text);
|
|
130
|
+
// the demo's own files are the ones whose code follows, introduced as **`src/file.ts`**
|
|
131
|
+
const files = block.map((l) => l.match(/^\*\*`([^`]+)`\*\*\s*$/)?.[1]).filter((f) => !!f);
|
|
132
|
+
const names = files.length ? files.join(', ') : 'its files';
|
|
133
|
+
out.push(`_Demo project (${start[1]}): ${names} — run \`adaptable docs demo <name>\` for the code, or \`docs get --full\` to inline it._`);
|
|
134
|
+
trimmed++;
|
|
135
|
+
// keep a blank line before the next heading
|
|
136
|
+
out.push('');
|
|
137
|
+
i = end - 1;
|
|
138
|
+
}
|
|
139
|
+
return { markdown: out.join('\n').replace(/\n{3,}/g, '\n\n'), trimmed };
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Cuts the Markdown at a heading boundary: whole sections (a heading and the text
|
|
143
|
+
* up to the next heading) are kept while the running total stays within
|
|
144
|
+
* `maxTokens`; the preamble before the first heading is always kept. The headings
|
|
145
|
+
* of the dropped sections are listed in `omitted` so `--section` can fetch one.
|
|
146
|
+
*/
|
|
147
|
+
export function truncateAtHeadings(markdown, maxTokens) {
|
|
148
|
+
if (estimateTokens(markdown) <= maxTokens) {
|
|
149
|
+
return { markdown, truncated: false, omitted: [] };
|
|
150
|
+
}
|
|
151
|
+
const lines = parseLines(markdown);
|
|
152
|
+
const sections = [];
|
|
153
|
+
let current = { lines: [] };
|
|
154
|
+
for (const line of lines) {
|
|
155
|
+
if (line.level !== undefined && (current.lines.length || current.heading)) {
|
|
156
|
+
sections.push({ heading: current.heading, text: current.lines.join('\n') });
|
|
157
|
+
current = { heading: line, lines: [line.text] };
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
current.lines.push(line.text);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
sections.push({ heading: current.heading, text: current.lines.join('\n') });
|
|
164
|
+
const kept = [];
|
|
165
|
+
const omitted = [];
|
|
166
|
+
let tokens = 0;
|
|
167
|
+
let cutting = false;
|
|
168
|
+
sections.forEach((section, index) => {
|
|
169
|
+
const cost = estimateTokens(section.text) + 1;
|
|
170
|
+
if (index > 0 && (cutting || tokens + cost > maxTokens)) {
|
|
171
|
+
cutting = true;
|
|
172
|
+
if (section.heading && section.heading.level <= 3) {
|
|
173
|
+
omitted.push(section.heading.text);
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
kept.push(section.text);
|
|
178
|
+
tokens += cost;
|
|
179
|
+
});
|
|
180
|
+
return { markdown: kept.join('\n').trimEnd(), truncated: true, omitted };
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=get-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-page.js","sourceRoot":"","sources":["../../../src/core/docs/get-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which docs host serves a major (plan §7.4): the override, the manifest's
|
|
3
|
+
* `docsHosts`, the current host for the current major, else the archived-host
|
|
4
|
+
* pattern. The host's own manifest is then fetched (§8.3 freshness) so the
|
|
5
|
+
* corpus loader knows which files to read.
|
|
6
|
+
*/
|
|
7
|
+
import { fetchManifest, getManifestInfo, ManifestUnavailable, } from '../compat/manifest.js';
|
|
8
|
+
import { CURRENT_DOCS_HOST, DOCS_HOST_ENV } from '../constants.js';
|
|
9
|
+
import { CapabilityError } from '../envelope.js';
|
|
10
|
+
/**
|
|
11
|
+
* The docs host for a major: the override (`--docs-host` / `ADAPTABLE_MCP_DOCS_HOST`) when
|
|
12
|
+
* given; the manifest's `docsHosts` entry; the current host for the current (or an unknown)
|
|
13
|
+
* major; else the archived-host pattern.
|
|
14
|
+
*/
|
|
15
|
+
export function docsHostFor(major, info = {}, override = process.env[DOCS_HOST_ENV]) {
|
|
16
|
+
if (override) {
|
|
17
|
+
return override.replace(/\/+$/, '');
|
|
18
|
+
}
|
|
19
|
+
if (major === undefined) {
|
|
20
|
+
return CURRENT_DOCS_HOST;
|
|
21
|
+
}
|
|
22
|
+
const mapped = info.docsHosts?.[String(major)];
|
|
23
|
+
if (mapped) {
|
|
24
|
+
return mapped.replace(/\/+$/, '');
|
|
25
|
+
}
|
|
26
|
+
if (info.latestMajor === undefined || major >= info.latestMajor) {
|
|
27
|
+
return CURRENT_DOCS_HOST;
|
|
28
|
+
}
|
|
29
|
+
return major >= 21 ? `https://v${major}.adaptabletools.com` : `https://v${major}.docs.adaptabletools.com`;
|
|
30
|
+
}
|
|
31
|
+
export function pageUrl(baseUrl, routePath, framework) {
|
|
32
|
+
return `${baseUrl}${routePath}${framework && framework !== 'vanilla' ? `?framework=${framework}` : ''}`;
|
|
33
|
+
}
|
|
34
|
+
export const docsNotAvailable = (host, reason) => new CapabilityError('DOCS_NOT_AVAILABLE', `${reason} (${host}).`, `Read the HTML documentation at ${host}/docs, pass --docs-host <url> for a host with machine-readable docs, or retry with network access.`);
|
|
35
|
+
/**
|
|
36
|
+
* Resolves the host for `major` and fetches that host's manifest. The current
|
|
37
|
+
* host's manifest is consulted first (for `docsHosts`) unless an override is given.
|
|
38
|
+
*/
|
|
39
|
+
export async function resolveDocsSource(options = {}) {
|
|
40
|
+
const warnings = [];
|
|
41
|
+
const override = options.docsHost ?? process.env[DOCS_HOST_ENV];
|
|
42
|
+
let current;
|
|
43
|
+
if (!override) {
|
|
44
|
+
current = await getManifestInfo({ offline: options.offline, maxAgeMs: options.revalidateTtlMs });
|
|
45
|
+
}
|
|
46
|
+
const host = docsHostFor(options.major, current ? { latestMajor: current.latest.adaptableMajor, docsHosts: current.docsHosts } : {}, override);
|
|
47
|
+
const isCurrentHost = host === (current?.host ?? CURRENT_DOCS_HOST);
|
|
48
|
+
let fetched;
|
|
49
|
+
try {
|
|
50
|
+
fetched =
|
|
51
|
+
current && host === current.host
|
|
52
|
+
? { manifest: current.manifest, source: current.source, warning: current.warning }
|
|
53
|
+
: await fetchManifest({
|
|
54
|
+
docsHost: host,
|
|
55
|
+
offline: options.offline,
|
|
56
|
+
maxAgeMs: options.revalidateTtlMs,
|
|
57
|
+
allowSnapshot: isCurrentHost,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof ManifestUnavailable) {
|
|
62
|
+
throw docsNotAvailable(host, `No machine-readable docs could be read: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
if (fetched.warning) {
|
|
67
|
+
warnings.push(fetched.warning);
|
|
68
|
+
}
|
|
69
|
+
if (options.major !== undefined && fetched.manifest.major !== options.major) {
|
|
70
|
+
warnings.push(`The docs at ${host} are for AdapTable ${fetched.manifest.major}, not ${options.major}; pass --docs-host for a host that serves ${options.major}.`);
|
|
71
|
+
}
|
|
72
|
+
return { host, manifest: fetched.manifest, manifestSource: fetched.source, current, warnings };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../../src/core/docs/hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/core/docs/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const SCHEMA_VERSION = 1;
|
|
2
|
+
export const ERROR_CODES = [
|
|
3
|
+
'USAGE',
|
|
4
|
+
'NOT_FOUND',
|
|
5
|
+
'NO_ADAPTABLE_DEPENDENCY',
|
|
6
|
+
'MULTIPLE_PROJECTS',
|
|
7
|
+
'VERSION_NOT_SUPPORTED',
|
|
8
|
+
'UNSUPPORTED_FOR_MAJOR',
|
|
9
|
+
'PACKAGE_REQUIRED',
|
|
10
|
+
'DOCS_NOT_AVAILABLE',
|
|
11
|
+
'INPUT_TOO_LARGE',
|
|
12
|
+
'NETWORK_REQUIRED',
|
|
13
|
+
'NOT_AVAILABLE_OVER_MCP',
|
|
14
|
+
'NOT_AVAILABLE_REMOTELY',
|
|
15
|
+
'EXTRACTION_FAILED',
|
|
16
|
+
'RECORDS_INVALID',
|
|
17
|
+
];
|
|
18
|
+
export function ok(data, extra = {}) {
|
|
19
|
+
return {
|
|
20
|
+
schemaVersion: SCHEMA_VERSION,
|
|
21
|
+
ok: true,
|
|
22
|
+
...(extra.resolvedContext ? { resolvedContext: extra.resolvedContext } : {}),
|
|
23
|
+
warnings: extra.warnings ?? [],
|
|
24
|
+
issues: extra.issues ?? [],
|
|
25
|
+
data,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function fail(code, message, hint, details) {
|
|
29
|
+
return {
|
|
30
|
+
schemaVersion: SCHEMA_VERSION,
|
|
31
|
+
ok: false,
|
|
32
|
+
error: { code, message, hint, ...(details ? { details } : {}) },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Thrown inside a capability (or context resolution); `runCapability` turns it into a failure envelope. */
|
|
36
|
+
export class CapabilityError extends Error {
|
|
37
|
+
code;
|
|
38
|
+
hint;
|
|
39
|
+
details;
|
|
40
|
+
constructor(code, message, hint, details) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = 'CapabilityError';
|
|
43
|
+
this.code = code;
|
|
44
|
+
this.hint = hint;
|
|
45
|
+
this.details = details;
|
|
46
|
+
}
|
|
47
|
+
toEnvelope() {
|
|
48
|
+
return fail(this.code, this.message, this.hint, this.details);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const EXIT_CODES = { ok: 0, findings: 1, usage: 2, environment: 3 };
|
|
52
|
+
/** Which exit class each error code belongs to (plan §7.1: 2 usage, 3 environment) */
|
|
53
|
+
export const ERROR_EXIT_CLASS = {
|
|
54
|
+
USAGE: 'usage',
|
|
55
|
+
NOT_FOUND: 'usage',
|
|
56
|
+
INPUT_TOO_LARGE: 'usage',
|
|
57
|
+
EXTRACTION_FAILED: 'usage',
|
|
58
|
+
NOT_AVAILABLE_OVER_MCP: 'usage',
|
|
59
|
+
NOT_AVAILABLE_REMOTELY: 'usage',
|
|
60
|
+
NO_ADAPTABLE_DEPENDENCY: 'environment',
|
|
61
|
+
MULTIPLE_PROJECTS: 'environment',
|
|
62
|
+
VERSION_NOT_SUPPORTED: 'environment',
|
|
63
|
+
UNSUPPORTED_FOR_MAJOR: 'environment',
|
|
64
|
+
PACKAGE_REQUIRED: 'environment',
|
|
65
|
+
DOCS_NOT_AVAILABLE: 'environment',
|
|
66
|
+
NETWORK_REQUIRED: 'environment',
|
|
67
|
+
RECORDS_INVALID: 'environment',
|
|
68
|
+
};
|
|
69
|
+
/** Issue severities that make a successful call a "findings" exit (1); `info` does not. */
|
|
70
|
+
export const FINDING_SEVERITIES = ['error', 'warning'];
|
|
71
|
+
export function exitCodeFor(envelope) {
|
|
72
|
+
if (!envelope.ok) {
|
|
73
|
+
return EXIT_CODES[ERROR_EXIT_CLASS[envelope.error.code]];
|
|
74
|
+
}
|
|
75
|
+
return envelope.issues.some((issue) => FINDING_SEVERITIES.includes(issue.severity))
|
|
76
|
+
? EXIT_CODES.findings
|
|
77
|
+
: EXIT_CODES.ok;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/core/envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The only import surface for `src/cli` and `src/mcp` (plan Appendix H).
|
|
3
|
+
* Runtime exports are the Appendix H eight — `listCapabilities`, `getCapability`,
|
|
4
|
+
* `runCapability`, `CLI_PACKAGE`, `CLI_RANGE`, `RECORDS_FLOOR`, `MIGRATION_FLOOR`,
|
|
5
|
+
* `SCHEMA_VERSION` — plus two reviewed additions for the bindings (A0.3):
|
|
6
|
+
* `exitCodeFor` (the §7.1 exit mapping the CLI applies) and `CLI_VERSION`
|
|
7
|
+
* (reported by `--version`, `--capabilities` and the MCP server info).
|
|
8
|
+
* Adding an export is a reviewed change.
|
|
9
|
+
*/
|
|
10
|
+
import './register.js';
|
|
11
|
+
export { CLI_PACKAGE, CLI_RANGE, MIGRATION_FLOOR, PACKAGE_VERSION as CLI_VERSION, RECORDS_FLOOR, SCHEMA_VERSION, getCapability, listCapabilities, runCapability, } from './capabilities.js';
|
|
12
|
+
export { exitCodeFor } from './envelope.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EACX,SAAS,EACT,eAAe,EACf,eAAe,IAAI,WAAW,EAC9B,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The on-disk cache (plan §7.1): `~/.cache/adaptable-mcp/` — `$XDG_CACHE_HOME`
|
|
3
|
+
* honoured, `ADAPTABLE_MCP_CACHE_DIR` overrides — with
|
|
4
|
+
* pkgs/@adaptabletools/adaptable@<version>/ extracted library packages (§7.3)
|
|
5
|
+
* entries/<version>/<entry>.mjs esbuild bundles of a package's entries
|
|
6
|
+
* docs/<host>/<manifest hash>/ docs corpora (A1.1)
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { LIBRARY_PACKAGE } from '../constants.js';
|
|
12
|
+
import { compareSemver } from './versions.js';
|
|
13
|
+
export function getCacheRoot() {
|
|
14
|
+
return (process.env.ADAPTABLE_MCP_CACHE_DIR ||
|
|
15
|
+
join(process.env.XDG_CACHE_HOME || join(homedir(), '.cache'), 'adaptable-mcp'));
|
|
16
|
+
}
|
|
17
|
+
/** A cache folder, created on demand */
|
|
18
|
+
export function getCacheDir(...segments) {
|
|
19
|
+
const dir = join(getCacheRoot(), ...segments);
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
export const PKGS_DIR = 'pkgs';
|
|
24
|
+
export const ENTRIES_DIR = 'entries';
|
|
25
|
+
export const DOCS_DIR = 'docs';
|
|
26
|
+
/** Folder a cached library version lives in (its `package.json` is directly inside) */
|
|
27
|
+
export function packageCacheDir(version) {
|
|
28
|
+
return join(getCacheRoot(), PKGS_DIR, `${LIBRARY_PACKAGE}@${version}`);
|
|
29
|
+
}
|
|
30
|
+
export function entriesCacheDir(version) {
|
|
31
|
+
return join(getCacheRoot(), ENTRIES_DIR, version);
|
|
32
|
+
}
|
|
33
|
+
/** Cached library packages, oldest first */
|
|
34
|
+
export function listCachedPackages() {
|
|
35
|
+
const scopeDir = join(getCacheRoot(), PKGS_DIR, LIBRARY_PACKAGE.split('/')[0]);
|
|
36
|
+
const prefix = `${LIBRARY_PACKAGE.split('/')[1]}@`;
|
|
37
|
+
let names;
|
|
38
|
+
try {
|
|
39
|
+
names = readdirSync(scopeDir);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
return names
|
|
45
|
+
.filter((name) => name.startsWith(prefix) && existsSync(join(scopeDir, name, 'package.json')))
|
|
46
|
+
.map((name) => ({ version: name.slice(prefix.length), dir: join(scopeDir, name) }))
|
|
47
|
+
.sort((a, b) => compareSemver(a.version, b.version));
|
|
48
|
+
}
|
|
49
|
+
function folderSize(dir) {
|
|
50
|
+
let total = 0;
|
|
51
|
+
const walk = (path) => {
|
|
52
|
+
let entries;
|
|
53
|
+
try {
|
|
54
|
+
entries = readdirSync(path, { withFileTypes: true });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
const full = join(path, entry.name);
|
|
61
|
+
if (entry.isDirectory()) {
|
|
62
|
+
walk(full);
|
|
63
|
+
}
|
|
64
|
+
else if (entry.isFile()) {
|
|
65
|
+
try {
|
|
66
|
+
total += statSync(full).size;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// removed meanwhile
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
walk(dir);
|
|
75
|
+
return total;
|
|
76
|
+
}
|
|
77
|
+
function ageDays(path) {
|
|
78
|
+
try {
|
|
79
|
+
return Math.floor((Date.now() - statSync(path).mtimeMs) / 86_400_000);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** What `cache list` shows: packages, entry bundles and docs corpora with sizes and ages */
|
|
86
|
+
export function summarizeCache() {
|
|
87
|
+
const root = getCacheRoot();
|
|
88
|
+
const packages = listCachedPackages().map(({ version, dir }) => ({
|
|
89
|
+
version,
|
|
90
|
+
bytes: folderSize(dir),
|
|
91
|
+
ageDays: ageDays(dir),
|
|
92
|
+
}));
|
|
93
|
+
const entriesRoot = join(root, ENTRIES_DIR);
|
|
94
|
+
const entries = (existsSync(entriesRoot) ? readdirSync(entriesRoot) : [])
|
|
95
|
+
.filter((version) => statSync(join(entriesRoot, version)).isDirectory())
|
|
96
|
+
.sort(compareSemver)
|
|
97
|
+
.map((version) => ({
|
|
98
|
+
version,
|
|
99
|
+
files: readdirSync(join(entriesRoot, version)).sort(),
|
|
100
|
+
bytes: folderSize(join(entriesRoot, version)),
|
|
101
|
+
}));
|
|
102
|
+
const docsRoot = join(root, DOCS_DIR);
|
|
103
|
+
const docs = [];
|
|
104
|
+
if (existsSync(docsRoot)) {
|
|
105
|
+
for (const host of readdirSync(docsRoot).sort()) {
|
|
106
|
+
const hostDir = join(docsRoot, host);
|
|
107
|
+
if (!statSync(hostDir).isDirectory()) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
for (const hash of readdirSync(hostDir).sort()) {
|
|
111
|
+
const dir = join(hostDir, hash);
|
|
112
|
+
if (statSync(dir).isDirectory()) {
|
|
113
|
+
docs.push({ host, hash, bytes: folderSize(dir), ageDays: ageDays(dir) });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { root, packages, entries, docs };
|
|
119
|
+
}
|
|
120
|
+
/** Removes docs corpora and/or packages (with their entry bundles); everything when neither flag is set */
|
|
121
|
+
export function clearCache(options = {}) {
|
|
122
|
+
const all = !options.docs && !options.pkgs;
|
|
123
|
+
const root = getCacheRoot();
|
|
124
|
+
const removed = [];
|
|
125
|
+
const targets = [
|
|
126
|
+
...(all || options.docs ? [DOCS_DIR] : []),
|
|
127
|
+
...(all || options.pkgs ? [PKGS_DIR, ENTRIES_DIR] : []),
|
|
128
|
+
];
|
|
129
|
+
for (const target of targets) {
|
|
130
|
+
const dir = join(root, target);
|
|
131
|
+
if (existsSync(dir)) {
|
|
132
|
+
rmSync(dir, { recursive: true, force: true });
|
|
133
|
+
removed.push(target);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { removed };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/core/packages/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `adaptable cache add <major|version|tag>` · `cache list` · `cache clear [--docs|--pkgs]` (plan §8.13).
|
|
3
|
+
* CLI only: an MCP client has no business filling a user's cache.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { registerCapability } from '../capabilities.js';
|
|
7
|
+
import { LIBRARY_PACKAGE } from '../constants.js';
|
|
8
|
+
import { CapabilityError, ok } from '../envelope.js';
|
|
9
|
+
import { clearCache, listCachedPackages, summarizeCache } from './cache.js';
|
|
10
|
+
import { npmRegistry } from './registry.js';
|
|
11
|
+
import { pickVersion } from './resolve.js';
|
|
12
|
+
/** Tests swap the registry; production uses npm */
|
|
13
|
+
let registryFactory = (cwd) => npmRegistry({ cwd });
|
|
14
|
+
export function setPackageRegistryFactory(factory) {
|
|
15
|
+
registryFactory = factory;
|
|
16
|
+
}
|
|
17
|
+
const formatBytes = (bytes) => bytes >= 1_048_576 ? `${(bytes / 1_048_576).toFixed(1)} MB` : `${Math.ceil(bytes / 1024)} kB`;
|
|
18
|
+
registerCapability({
|
|
19
|
+
name: 'cache-add',
|
|
20
|
+
description: `Downloads a ${LIBRARY_PACKAGE} version into the cache so checks and migrations for that major work offline.`,
|
|
21
|
+
cli: { command: ['cache', 'add'], positionals: ['spec'] },
|
|
22
|
+
mcp: null,
|
|
23
|
+
input: z.object({
|
|
24
|
+
spec: z.string().describe('A major (23), an exact version (23.1.1) or a dist-tag (canary)'),
|
|
25
|
+
}),
|
|
26
|
+
output: z.object({
|
|
27
|
+
version: z.string(),
|
|
28
|
+
dir: z.string(),
|
|
29
|
+
status: z.enum(['downloaded', 'already-cached']),
|
|
30
|
+
}),
|
|
31
|
+
run: async (input, ctx) => {
|
|
32
|
+
if (ctx.globals.offline) {
|
|
33
|
+
throw new CapabilityError('NETWORK_REQUIRED', '`cache add` downloads from the npm registry and cannot run with --offline.', 'Drop --offline, or run the command on a connected machine and copy the cache folder.');
|
|
34
|
+
}
|
|
35
|
+
const registry = registryFactory(ctx.cwd);
|
|
36
|
+
const view = await registry.view();
|
|
37
|
+
const version = pickVersion(input.spec, view);
|
|
38
|
+
if (!version) {
|
|
39
|
+
throw new CapabilityError('VERSION_NOT_SUPPORTED', `The npm registry has no ${LIBRARY_PACKAGE} matching "${input.spec}".`, `Pass a published major (${[...new Set(view.versions.map((v) => v.split('.')[0]))].slice(-4).join(', ')}), an exact version or a dist-tag (${Object.keys(view.distTags).join(', ')}).`);
|
|
40
|
+
}
|
|
41
|
+
const cached = listCachedPackages().find((p) => p.version === version);
|
|
42
|
+
if (cached) {
|
|
43
|
+
return ok({ version, dir: cached.dir, status: 'already-cached' });
|
|
44
|
+
}
|
|
45
|
+
const dir = await registry.fetch(version);
|
|
46
|
+
return ok({ version, dir, status: 'downloaded' });
|
|
47
|
+
},
|
|
48
|
+
markdown: (data) => data.status === 'downloaded'
|
|
49
|
+
? `Cached ${LIBRARY_PACKAGE}@${data.version} at \`${data.dir}\`.`
|
|
50
|
+
: `${LIBRARY_PACKAGE}@${data.version} was already cached at \`${data.dir}\`.`,
|
|
51
|
+
});
|
|
52
|
+
registerCapability({
|
|
53
|
+
name: 'cache-list',
|
|
54
|
+
description: 'Shows cached library packages, bundled entries and docs corpora with sizes and ages.',
|
|
55
|
+
cli: { command: ['cache', 'list'] },
|
|
56
|
+
mcp: null,
|
|
57
|
+
input: z.object({}),
|
|
58
|
+
output: z.object({
|
|
59
|
+
root: z.string(),
|
|
60
|
+
packages: z.array(z.object({ version: z.string(), bytes: z.number(), ageDays: z.number().optional() })),
|
|
61
|
+
entries: z.array(z.object({ version: z.string(), files: z.array(z.string()), bytes: z.number() })),
|
|
62
|
+
docs: z.array(z.object({ host: z.string(), hash: z.string(), bytes: z.number(), ageDays: z.number().optional() })),
|
|
63
|
+
}),
|
|
64
|
+
run: async () => ok(summarizeCache()),
|
|
65
|
+
markdown: (data) => {
|
|
66
|
+
const lines = [`Cache: \`${data.root}\``, ''];
|
|
67
|
+
lines.push(`## Packages (${data.packages.length})`, '');
|
|
68
|
+
for (const p of data.packages) {
|
|
69
|
+
lines.push(`- ${LIBRARY_PACKAGE}@${p.version} — ${formatBytes(p.bytes)}${p.ageDays !== undefined ? `, ${p.ageDays} d old` : ''}`);
|
|
70
|
+
}
|
|
71
|
+
lines.push('', `## Entry bundles (${data.entries.length})`, '');
|
|
72
|
+
for (const e of data.entries) {
|
|
73
|
+
lines.push(`- ${e.version}: ${e.files.join(', ')} — ${formatBytes(e.bytes)}`);
|
|
74
|
+
}
|
|
75
|
+
lines.push('', `## Docs corpora (${data.docs.length})`, '');
|
|
76
|
+
for (const d of data.docs) {
|
|
77
|
+
lines.push(`- ${d.host} (${d.hash}) — ${formatBytes(d.bytes)}${d.ageDays !== undefined ? `, ${d.ageDays} d old` : ''}`);
|
|
78
|
+
}
|
|
79
|
+
return lines.join('\n');
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
registerCapability({
|
|
83
|
+
name: 'cache-clear',
|
|
84
|
+
description: 'Removes cached docs corpora and/or library packages (with their entry bundles); everything when no flag is given.',
|
|
85
|
+
cli: { command: ['cache', 'clear'] },
|
|
86
|
+
mcp: null,
|
|
87
|
+
input: z.object({
|
|
88
|
+
docs: z.boolean().optional().describe('Remove docs corpora only'),
|
|
89
|
+
pkgs: z.boolean().optional().describe('Remove packages and entry bundles only'),
|
|
90
|
+
}),
|
|
91
|
+
output: z.object({ removed: z.array(z.string()) }),
|
|
92
|
+
run: async (input) => ok(clearCache(input)),
|
|
93
|
+
markdown: (data) => (data.removed.length ? `Removed: ${data.removed.join(', ')}.` : 'Nothing to remove.'),
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/core/packages/capabilities.ts"],"names":[],"mappings":"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"}
|