@adaptabletools/adaptable-mcp 0.0.0-stage → 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.
Files changed (75) hide show
  1. package/README.md +90 -2
  2. package/data/manifest.snapshot.json +184 -0
  3. package/dist/bin.js +16 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/cli/build-commands.js +200 -0
  6. package/dist/cli/build-commands.js.map +1 -0
  7. package/dist/cli/index.js +86 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/render.js +57 -0
  10. package/dist/cli/render.js.map +1 -0
  11. package/dist/core/capabilities.js +99 -0
  12. package/dist/core/capabilities.js.map +1 -0
  13. package/dist/core/compat/capabilities.js +127 -0
  14. package/dist/core/compat/capabilities.js.map +1 -0
  15. package/dist/core/compat/manifest.js +203 -0
  16. package/dist/core/compat/manifest.js.map +1 -0
  17. package/dist/core/constants.js +38 -0
  18. package/dist/core/constants.js.map +1 -0
  19. package/dist/core/context/capabilities.js +106 -0
  20. package/dist/core/context/capabilities.js.map +1 -0
  21. package/dist/core/context/detect.js +370 -0
  22. package/dist/core/context/detect.js.map +1 -0
  23. package/dist/core/context/projects.js +159 -0
  24. package/dist/core/context/projects.js.map +1 -0
  25. package/dist/core/context/resolve.js +85 -0
  26. package/dist/core/context/resolve.js.map +1 -0
  27. package/dist/core/docs/areas.js +22 -0
  28. package/dist/core/docs/areas.js.map +1 -0
  29. package/dist/core/docs/cache.js +133 -0
  30. package/dist/core/docs/cache.js.map +1 -0
  31. package/dist/core/docs/capabilities.js +381 -0
  32. package/dist/core/docs/capabilities.js.map +1 -0
  33. package/dist/core/docs/corpus.js +114 -0
  34. package/dist/core/docs/corpus.js.map +1 -0
  35. package/dist/core/docs/demos.js +105 -0
  36. package/dist/core/docs/demos.js.map +1 -0
  37. package/dist/core/docs/get-page.js +182 -0
  38. package/dist/core/docs/get-page.js.map +1 -0
  39. package/dist/core/docs/hosts.js +74 -0
  40. package/dist/core/docs/hosts.js.map +1 -0
  41. package/dist/core/docs/search.js +92 -0
  42. package/dist/core/docs/search.js.map +1 -0
  43. package/dist/core/envelope.js +79 -0
  44. package/dist/core/envelope.js.map +1 -0
  45. package/dist/core/index.js +13 -0
  46. package/dist/core/index.js.map +1 -0
  47. package/dist/core/packages/cache.js +138 -0
  48. package/dist/core/packages/cache.js.map +1 -0
  49. package/dist/core/packages/capabilities.js +95 -0
  50. package/dist/core/packages/capabilities.js.map +1 -0
  51. package/dist/core/packages/entry-types.js +13 -0
  52. package/dist/core/packages/entry-types.js.map +1 -0
  53. package/dist/core/packages/exec.js +37 -0
  54. package/dist/core/packages/exec.js.map +1 -0
  55. package/dist/core/packages/load-entry.js +123 -0
  56. package/dist/core/packages/load-entry.js.map +1 -0
  57. package/dist/core/packages/prepare.js +122 -0
  58. package/dist/core/packages/prepare.js.map +1 -0
  59. package/dist/core/packages/registry.js +75 -0
  60. package/dist/core/packages/registry.js.map +1 -0
  61. package/dist/core/packages/resolve.js +94 -0
  62. package/dist/core/packages/resolve.js.map +1 -0
  63. package/dist/core/packages/versions.js +71 -0
  64. package/dist/core/packages/versions.js.map +1 -0
  65. package/dist/core/ping.js +22 -0
  66. package/dist/core/ping.js.map +1 -0
  67. package/dist/core/register.js +10 -0
  68. package/dist/core/register.js.map +1 -0
  69. package/dist/core/state/rules.js +417 -0
  70. package/dist/core/state/rules.js.map +1 -0
  71. package/dist/core/state/type-check.js +142 -0
  72. package/dist/core/state/type-check.js.map +1 -0
  73. package/dist/mcp/index.js +21 -0
  74. package/dist/mcp/index.js.map +1 -0
  75. package/package.json +50 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/cli/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * The capability registry (plan §6.1). One entry per capability; the CLI tree,
3
+ * the MCP tool list, `--help --json`, `skills/_shared/capabilities.md` and the
4
+ * parity tests are all generated from it.
5
+ */
6
+ import { resolve as resolvePath } from 'node:path';
7
+ import { z } from 'zod';
8
+ import { getManifestInfo } from './compat/manifest.js';
9
+ import { resolveContext, } from './context/resolve.js';
10
+ import { FRAMEWORKS } from './docs/corpus.js';
11
+ import { CapabilityError, fail, SCHEMA_VERSION } from './envelope.js';
12
+ export { CLI_PACKAGE, CLI_RANGE, CURRENT_DOCS_HOST, MIGRATION_FLOOR, PACKAGE_VERSION, RECORDS_FLOOR, } from './constants.js';
13
+ export { SCHEMA_VERSION };
14
+ /** Global flags shared by every command (plan §7.1); `--json` and `--quiet` are rendering flags the bindings own. */
15
+ export const GlobalOptionsSchema = z.object({
16
+ cwd: z.string().optional().describe('Project folder; defaults to the current directory'),
17
+ major: z.number().int().optional().describe('AdapTable major to assume instead of detecting it'),
18
+ framework: z.enum(FRAMEWORKS).optional().describe('Framework to assume instead of detecting it'),
19
+ offline: z.boolean().optional().describe('Never touch the network; use caches and bundled snapshots'),
20
+ docsHost: z.string().optional().describe('Docs host to read instead of the default one'),
21
+ });
22
+ const registry = new Map();
23
+ export function registerCapability(capability) {
24
+ if (registry.has(capability.name)) {
25
+ throw new Error(`Capability "${capability.name}" is already registered.`);
26
+ }
27
+ const command = capability.cli.command.join(' ');
28
+ for (const existing of registry.values()) {
29
+ if (existing.cli.command.join(' ') === command) {
30
+ throw new Error(`CLI command "${command}" is already bound to capability "${existing.name}".`);
31
+ }
32
+ if (capability.mcp && existing.mcp?.tool === capability.mcp.tool) {
33
+ throw new Error(`MCP tool "${capability.mcp.tool}" is already bound to capability "${existing.name}".`);
34
+ }
35
+ }
36
+ registry.set(capability.name, capability);
37
+ }
38
+ export function listCapabilities(options = {}) {
39
+ return [...registry.values()].filter((c) => options.includeHidden || !c.hidden);
40
+ }
41
+ export function getCapability(name) {
42
+ return registry.get(name);
43
+ }
44
+ /** Step 4 of §7.2 and the docs host map, from the manifest (hosted, cached or snapshot) */
45
+ async function latestFromManifest(globals) {
46
+ const info = await getManifestInfo({ offline: globals.offline, docsHost: globals.docsHost });
47
+ return info
48
+ ? {
49
+ adaptableMajor: info.latest.adaptableMajor,
50
+ adaptableVersion: info.latest.adaptableVersion,
51
+ ...(info.docsHosts ? { docsHosts: info.docsHosts } : {}),
52
+ }
53
+ : undefined;
54
+ }
55
+ function usageMessage(error) {
56
+ return error.issues
57
+ .map((issue) => (issue.path.length ? `${issue.path.map(String).join('.')}: ${issue.message}` : issue.message))
58
+ .join('; ');
59
+ }
60
+ /**
61
+ * Validates `input` against the capability's schema, runs it and returns the
62
+ * envelope. `CapabilityError`s become failure envelopes; any other throw is a bug
63
+ * and propagates to the binding.
64
+ */
65
+ export async function runCapability(name, input, globals = {}, options = {}) {
66
+ const capability = registry.get(name);
67
+ if (!capability) {
68
+ return fail('NOT_FOUND', `Unknown capability "${name}".`, 'Run `adaptable --help` for the commands this version supports; a skill that names a missing capability should fall back to the docs.');
69
+ }
70
+ const parsedGlobals = GlobalOptionsSchema.safeParse(globals);
71
+ if (!parsedGlobals.success) {
72
+ return fail('USAGE', `Invalid global options: ${usageMessage(parsedGlobals.error)}`, 'Run `adaptable --help`.');
73
+ }
74
+ const parsed = capability.input.safeParse(input ?? {});
75
+ if (!parsed.success) {
76
+ return fail('USAGE', `Invalid input for ${capability.cli.command.join(' ')}: ${usageMessage(parsed.error)}`, `Run \`adaptable ${capability.cli.command.join(' ')} --help\`.`);
77
+ }
78
+ const cwd = resolvePath(parsedGlobals.data.cwd ?? process.cwd());
79
+ const globalsWithCwd = { ...parsedGlobals.data, cwd };
80
+ let resolution;
81
+ const ctx = {
82
+ globals: parsedGlobals.data,
83
+ cwd,
84
+ resolveContext: () => (resolution ??= resolveContext(globalsWithCwd, {
85
+ ...options.resolve,
86
+ latest: options.resolve?.latest ?? (() => latestFromManifest(globalsWithCwd)),
87
+ })),
88
+ };
89
+ try {
90
+ return await capability.run(parsed.data, ctx);
91
+ }
92
+ catch (error) {
93
+ if (error instanceof CapabilityError) {
94
+ return error.toEnvelope();
95
+ }
96
+ throw error;
97
+ }
98
+ }
99
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/core/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * `adaptable compat [--adaptable <n>] [--ag-grid <n>] [--framework <fw>]` · MCP `get_compatibility` (plan §8.2).
3
+ * From the manifest only; no project needed.
4
+ */
5
+ import { z } from 'zod';
6
+ import { registerCapability } from '../capabilities.js';
7
+ import { FRAMEWORKS } from '../docs/corpus.js';
8
+ import { CapabilityError, ok } from '../envelope.js';
9
+ import { getManifestInfo, majorsWithRecords, pairingFor } from './manifest.js';
10
+ const Environment = z.object({
11
+ node: z.string().optional(),
12
+ typescript: z.string().optional(),
13
+ react: z.string().optional(),
14
+ angular: z.string().optional(),
15
+ vue: z.string().optional(),
16
+ });
17
+ const CompatOutput = z.object({
18
+ adaptable: z.object({ major: z.number(), latest: z.boolean(), latestMajor: z.number() }),
19
+ agGrid: z.object({
20
+ requiredMajor: z.number(),
21
+ requiredVersion: z.string(),
22
+ /** the range the latest AdapTable requires, when the manifest states it */
23
+ requiredByLatest: z.string().optional(),
24
+ }),
25
+ /** present when --ag-grid was given */
26
+ compatible: z.boolean().optional(),
27
+ wrappers: z.record(z.string(), z.string()).optional(),
28
+ environment: Environment.optional(),
29
+ releaseNote: z.string(),
30
+ docsHost: z.string(),
31
+ majorsWithRecords: z.array(z.number()),
32
+ manifest: z.object({ source: z.enum(['hosted', 'cached', 'snapshot']), builtAt: z.string(), host: z.string() }),
33
+ });
34
+ export const releaseNoteSlug = (major) => `version-${major}0-release-note`;
35
+ export function compatFor(info, adaptableMajor, input) {
36
+ const pairing = pairingFor(info, adaptableMajor);
37
+ if (!pairing) {
38
+ const known = [...new Set(info.pairings.map((p) => p.adaptableMajor))].sort((a, b) => a - b);
39
+ throw new CapabilityError('VERSION_NOT_SUPPORTED', `AdapTable ${adaptableMajor} is not in the documented AG Grid pairings.`, `Known majors: ${known.join(', ')}. Pass one of them with --adaptable, or check the release schedule at ${info.latest.docsHost}/support/release-schedule.`);
40
+ }
41
+ const warnings = [];
42
+ const key = String(adaptableMajor);
43
+ const wrappersAll = info.wrappers?.[key];
44
+ const wrappers = wrappersAll
45
+ ? input.framework
46
+ ? input.framework === 'vanilla'
47
+ ? {}
48
+ : wrappersAll[input.framework]
49
+ ? { [input.framework]: wrappersAll[input.framework] }
50
+ : {}
51
+ : wrappersAll
52
+ : undefined;
53
+ const environment = info.environment?.[key];
54
+ if (!info.environment || !info.wrappers) {
55
+ warnings.push(`The manifest from ${info.host} (built ${info.manifest.builtAt}) has no environment / wrapper table yet; those fields are omitted.`);
56
+ }
57
+ const docsHost = info.docsHosts?.[key] ?? (adaptableMajor >= info.latest.adaptableMajor ? info.latest.docsHost : `https://v${adaptableMajor}.adaptabletools.com`);
58
+ const data = {
59
+ adaptable: { major: adaptableMajor, latest: adaptableMajor === info.latest.adaptableMajor, latestMajor: info.latest.adaptableMajor },
60
+ agGrid: {
61
+ requiredMajor: pairing.agGridMajor,
62
+ requiredVersion: pairing.agGridVersion,
63
+ ...(info.latest.requiredAgGrid ? { requiredByLatest: info.latest.requiredAgGrid } : {}),
64
+ },
65
+ ...(input.agGrid !== undefined ? { compatible: input.agGrid === pairing.agGridMajor } : {}),
66
+ ...(wrappers ? { wrappers } : {}),
67
+ ...(environment ? { environment } : {}),
68
+ releaseNote: releaseNoteSlug(adaptableMajor),
69
+ docsHost,
70
+ majorsWithRecords: majorsWithRecords(),
71
+ manifest: { source: info.source, builtAt: info.manifest.builtAt, host: info.host },
72
+ };
73
+ return { data, warnings };
74
+ }
75
+ registerCapability({
76
+ name: 'compat',
77
+ description: 'AG Grid pairing, wrapper packages and environment requirements for an AdapTable major, from the docs manifest.',
78
+ cli: { command: ['compat'] },
79
+ mcp: { tool: 'get_compatibility' },
80
+ input: z.object({
81
+ adaptable: z.number().int().optional().describe('AdapTable major; defaults to the detected one, else the latest'),
82
+ agGrid: z.number().int().optional().describe('AG Grid major to check against the pairing'),
83
+ framework: z.enum(FRAMEWORKS).optional().describe('Return only this framework’s wrapper'),
84
+ }),
85
+ output: CompatOutput,
86
+ run: async (input, ctx) => {
87
+ const info = await getManifestInfo({ offline: ctx.globals.offline, docsHost: ctx.globals.docsHost });
88
+ if (!info) {
89
+ throw new CapabilityError('DOCS_NOT_AVAILABLE', 'No docs manifest could be read: the host is unreachable (or --offline) and nothing is cached or bundled.', 'Retry with network access, or pass --docs-host <url>.');
90
+ }
91
+ const warnings = [];
92
+ let major = input.adaptable;
93
+ let resolvedContext;
94
+ if (major === undefined) {
95
+ const resolution = await ctx.resolveContext();
96
+ resolvedContext = resolution.context;
97
+ warnings.push(...resolution.warnings);
98
+ major = resolution.context.adaptableMajor ?? info.latest.adaptableMajor;
99
+ }
100
+ const result = compatFor(info, major, { agGrid: input.agGrid, framework: input.framework ?? ctx.globals.framework });
101
+ return ok(result.data, { warnings: [...warnings, ...result.warnings], resolvedContext });
102
+ },
103
+ markdown: (data) => {
104
+ const lines = [
105
+ `# AdapTable ${data.adaptable.major}${data.adaptable.latest ? ' (latest)' : ` (latest is ${data.adaptable.latestMajor})`}`,
106
+ '',
107
+ `- AG Grid: ${data.agGrid.requiredMajor} (documented with ${data.agGrid.requiredVersion})${data.compatible !== undefined ? ` — your AG Grid is ${data.compatible ? 'compatible' : 'not the documented major'}` : ''}`,
108
+ ];
109
+ if (data.agGrid.requiredByLatest) {
110
+ lines.push(`- Latest AdapTable requires AG Grid ${data.agGrid.requiredByLatest}`);
111
+ }
112
+ if (data.wrappers && Object.keys(data.wrappers).length) {
113
+ lines.push(`- Wrappers: ${Object.entries(data.wrappers).map(([fw, pkg]) => `${fw} → \`${pkg}\``).join(', ')}`);
114
+ }
115
+ if (data.environment) {
116
+ lines.push(`- Environment: ${Object.entries(data.environment).map(([k, v]) => `${k} ${v}`).join(', ')}`);
117
+ }
118
+ lines.push(`- Release note: ${data.docsHost}/support/${data.releaseNote}`);
119
+ lines.push(`- Docs: ${data.docsHost}`);
120
+ if (data.majorsWithRecords.length) {
121
+ lines.push(`- Majors with change records: ${data.majorsWithRecords.join(', ')}`);
122
+ }
123
+ lines.push('', `_Manifest: ${data.manifest.source} from ${data.manifest.host}, built ${data.manifest.builtAt}_`);
124
+ return lines.join('\n');
125
+ },
126
+ });
127
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/core/compat/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAqB,MAAM,eAAe,CAAC;AAElG,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACxF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,2EAA2E;QAC3E,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACxC,CAAC;IACF,uCAAuC;IACvC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrD,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;CAChH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,WAAW,KAAK,gBAAgB,CAAC;AAE3F,MAAM,UAAU,SAAS,CACvB,IAAkB,EAClB,cAAsB,EACtB,KAAmE;IAEnE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7F,MAAM,IAAI,eAAe,CACvB,uBAAuB,EACvB,aAAa,cAAc,6CAA6C,EACxE,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yEAAyE,IAAI,CAAC,MAAM,CAAC,QAAQ,4BAA4B,CAC3J,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,KAAK,CAAC,SAAS;YACf,CAAC,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;gBAC7B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;oBAC5B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAE,EAAE;oBACtD,CAAC,CAAC,EAAE;YACR,CAAC,CAAE,WAAsC;QAC3C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CACX,qBAAqB,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,qEAAqE,CACpI,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,cAAc,qBAAqB,CAAC,CAAC;IAClK,MAAM,IAAI,GAAiC;QACzC,SAAS,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QACpI,MAAM,EAAE;YACN,aAAa,EAAE,OAAO,CAAC,WAAW;YAClC,eAAe,EAAE,OAAO,CAAC,aAAa;YACtC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxF;QACD,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,WAAW,EAAE,eAAe,CAAC,cAAc,CAAC;QAC5C,QAAQ;QACR,iBAAiB,EAAE,iBAAiB,EAAE;QACtC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KACnF,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,kBAAkB,CAAC;IACjB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,gHAAgH;IAC7H,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC5B,GAAG,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QACjH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC1F,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;KAC1F,CAAC;IACF,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,eAAe,CACvB,oBAAoB,EACpB,0GAA0G,EAC1G,uDAAuD,CACxD,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;QAC5B,IAAI,eAAe,CAAC;QACpB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC;YAC9C,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAC1E,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACrH,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG;YACZ,eAAe,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,EAAE;YAC1H,EAAE;YACF,cAAc,IAAI,CAAC,MAAM,CAAC,aAAa,qBAAqB,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;SACtN,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,uCAAuC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,iCAAiC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,IAAI,CAAC,QAAQ,CAAC,MAAM,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;QACjH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * The docs manifest (plan Appendix C, §8.3 "Freshness"): `GET <host>/llms/manifest.json`
3
+ * with `If-None-Match`, an ETag store under `docs/<host>/`, the bundled
4
+ * `data/manifest.snapshot.json` as the offline / unreachable fallback, and the
5
+ * derived `ManifestInfo` that `compat`, `detect` and context resolution consume.
6
+ */
7
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import { CURRENT_DOCS_HOST, RECORDS_FLOOR } from '../constants.js';
10
+ import { getCacheRoot, DOCS_DIR } from '../packages/cache.js';
11
+ import { compareSemver } from '../packages/versions.js';
12
+ const MANIFEST_PATH = '/llms/manifest.json';
13
+ const SNAPSHOT_URL = new URL('../../../data/manifest.snapshot.json', import.meta.url);
14
+ export function manifestHost(options = {}) {
15
+ return (options.docsHost ?? process.env.ADAPTABLE_MCP_DOCS_HOST ?? CURRENT_DOCS_HOST).replace(/\/+$/, '');
16
+ }
17
+ /** Folder for a host's cached manifest and corpora: `docs/<hostname>/` */
18
+ export function hostCacheDir(host) {
19
+ const name = host.replace(/^https?:\/\//, '').replace(/[^A-Za-z0-9.-]/g, '_');
20
+ return join(getCacheRoot(), DOCS_DIR, name);
21
+ }
22
+ function readJsonFile(path) {
23
+ try {
24
+ return JSON.parse(readFileSync(path, 'utf8'));
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ export function readSnapshot() {
31
+ return readJsonFile(SNAPSHOT_URL);
32
+ }
33
+ function readCachedManifest(host) {
34
+ const dir = hostCacheDir(host);
35
+ const manifest = readJsonFile(join(dir, 'manifest.json'));
36
+ if (!manifest) {
37
+ return undefined;
38
+ }
39
+ const readText = (name) => {
40
+ try {
41
+ return readFileSync(join(dir, name), 'utf8').trim() || undefined;
42
+ }
43
+ catch {
44
+ return undefined;
45
+ }
46
+ };
47
+ const checked = readText('manifest.checked');
48
+ return { manifest, etag: readText('manifest.etag'), checkedAt: checked ? Number(checked) : undefined };
49
+ }
50
+ function writeCachedManifest(host, manifest, etag) {
51
+ const dir = hostCacheDir(host);
52
+ mkdirSync(dir, { recursive: true });
53
+ writeFileSync(join(dir, 'manifest.json'), JSON.stringify(manifest, null, 2));
54
+ writeFileSync(join(dir, 'manifest.etag'), etag ?? '');
55
+ touchChecked(host);
56
+ }
57
+ function touchChecked(host) {
58
+ const dir = hostCacheDir(host);
59
+ mkdirSync(dir, { recursive: true });
60
+ writeFileSync(join(dir, 'manifest.checked'), String(Date.now()));
61
+ }
62
+ const fallback = (host, reason, allowSnapshot) => {
63
+ const cached = readCachedManifest(host);
64
+ if (cached) {
65
+ return { manifest: cached.manifest, source: 'cached', warning: `${reason}; using the manifest cached from ${host} (built ${cached.manifest.builtAt}).` };
66
+ }
67
+ const snapshot = allowSnapshot ? readSnapshot() : undefined;
68
+ if (snapshot) {
69
+ return { manifest: snapshot, source: 'snapshot', warning: `${reason}; using the bundled manifest snapshot (built ${snapshot.builtAt}).` };
70
+ }
71
+ throw new ManifestUnavailable(allowSnapshot
72
+ ? `${reason}, nothing is cached for ${host} and the bundled manifest snapshot is missing.`
73
+ : `${reason} and nothing is cached for ${host}.`);
74
+ };
75
+ export class ManifestUnavailable extends Error {
76
+ }
77
+ /**
78
+ * The manifest for a host. Online: conditional GET, `304` → cached copy, `200` →
79
+ * stored with its ETag; skipped entirely when the cached copy was validated within
80
+ * `maxAgeMs`. Offline or unreachable: cached copy, else (when allowed) the snapshot.
81
+ */
82
+ export async function fetchManifest(options = {}) {
83
+ const host = manifestHost(options);
84
+ const allowSnapshot = options.allowSnapshot ?? true;
85
+ const cached = readCachedManifest(host);
86
+ if (options.offline) {
87
+ if (cached) {
88
+ return { manifest: cached.manifest, source: 'cached' };
89
+ }
90
+ const snapshot = allowSnapshot ? readSnapshot() : undefined;
91
+ if (snapshot) {
92
+ return { manifest: snapshot, source: 'snapshot' };
93
+ }
94
+ throw new ManifestUnavailable(allowSnapshot
95
+ ? `--offline, nothing is cached for ${host} and the bundled manifest snapshot is missing.`
96
+ : `--offline and nothing is cached for ${host}.`);
97
+ }
98
+ if (cached?.checkedAt !== undefined && options.maxAgeMs && Date.now() - cached.checkedAt < options.maxAgeMs) {
99
+ return { manifest: cached.manifest, source: 'cached' };
100
+ }
101
+ let response;
102
+ try {
103
+ response = await fetch(`${host}${MANIFEST_PATH}`, {
104
+ headers: cached?.etag ? { 'If-None-Match': cached.etag } : {},
105
+ signal: AbortSignal.timeout(options.timeoutMs ?? 8_000),
106
+ });
107
+ }
108
+ catch (error) {
109
+ return fallback(host, `Could not reach ${host} (${error instanceof Error ? error.message : String(error)})`, allowSnapshot);
110
+ }
111
+ if (response.status === 304 && cached) {
112
+ touchChecked(host);
113
+ return { manifest: cached.manifest, source: 'cached' };
114
+ }
115
+ if (!response.ok) {
116
+ return fallback(host, `${host}${MANIFEST_PATH} returned ${response.status}`, allowSnapshot);
117
+ }
118
+ let manifest;
119
+ try {
120
+ manifest = (await response.json());
121
+ }
122
+ catch (error) {
123
+ return fallback(host, `${host}${MANIFEST_PATH} is not JSON (${error instanceof Error ? error.message : String(error)})`, allowSnapshot);
124
+ }
125
+ writeCachedManifest(host, manifest, response.headers.get('etag'));
126
+ return { manifest, source: 'hosted' };
127
+ }
128
+ export const majorOfPairing = (pairing) => Number(pairing.adaptableVersion.split('.')[0]);
129
+ /** Pairings sorted newest first (by AdapTable version) so `find` gives the newest row of a major */
130
+ export function normalisePairings(manifest) {
131
+ return [...manifest.agGridPairings]
132
+ .map((p) => ({ ...p, adaptableMajor: majorOfPairing(p) }))
133
+ .filter((p) => Number.isFinite(p.adaptableMajor))
134
+ .sort((a, b) => compareSemver(pad(b.adaptableVersion), pad(a.adaptableVersion)));
135
+ }
136
+ const pad = (version) => {
137
+ const parts = version.split('.');
138
+ while (parts.length < 3) {
139
+ parts.push('0');
140
+ }
141
+ return parts.join('.');
142
+ };
143
+ export function toManifestInfo(fetched, host) {
144
+ const { manifest } = fetched;
145
+ const latestMajor = manifest.latest?.adaptableMajor ?? manifest.major;
146
+ return {
147
+ latest: {
148
+ adaptableMajor: latestMajor,
149
+ adaptableVersion: manifest.adaptableVersion,
150
+ ...(manifest.latest?.requiredAgGrid ?? manifest.agGridPeer
151
+ ? { requiredAgGrid: manifest.latest?.requiredAgGrid ?? manifest.agGridPeer ?? undefined }
152
+ : {}),
153
+ docsHost: manifest.docsHosts?.[String(latestMajor)] ?? host,
154
+ ...(manifest.docsHosts ? { docsHosts: manifest.docsHosts } : {}),
155
+ },
156
+ pairings: normalisePairings(manifest),
157
+ ...(manifest.docsHosts ? { docsHosts: manifest.docsHosts } : {}),
158
+ ...(manifest.environment ? { environment: manifest.environment } : {}),
159
+ ...(manifest.wrappers ? { wrappers: manifest.wrappers } : {}),
160
+ source: fetched.source,
161
+ manifest,
162
+ host,
163
+ ...(fetched.warning ? { warning: fetched.warning } : {}),
164
+ };
165
+ }
166
+ /** The manifest-derived facts, or undefined when no manifest can be had at all */
167
+ export async function getManifestInfo(options = {}) {
168
+ const host = manifestHost(options);
169
+ try {
170
+ return toManifestInfo(await fetchManifest(options), host);
171
+ }
172
+ catch (error) {
173
+ if (error instanceof ManifestUnavailable) {
174
+ return undefined;
175
+ }
176
+ throw error;
177
+ }
178
+ }
179
+ /** The documented AG Grid pairing for an AdapTable major (its newest row) */
180
+ export function pairingFor(info, adaptableMajor) {
181
+ if (!info || adaptableMajor === undefined) {
182
+ return undefined;
183
+ }
184
+ return info.pairings.find((p) => p.adaptableMajor === adaptableMajor);
185
+ }
186
+ /** Majors with change records bundled in `data/changes/<N-1>-<N>.json` */
187
+ export function majorsWithRecords(dataDir = new URL('../../../data/changes/', import.meta.url)) {
188
+ if (!existsSync(dataDir)) {
189
+ return [];
190
+ }
191
+ try {
192
+ return readdirSync(dataDir)
193
+ .map((name) => name.match(/^\d+-(\d+)\.json$/)?.[1])
194
+ .filter((m) => !!m)
195
+ .map(Number)
196
+ .filter((m) => m >= RECORDS_FLOOR)
197
+ .sort((a, b) => a - b);
198
+ }
199
+ catch {
200
+ return [];
201
+ }
202
+ }
203
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/core/compat/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Values shared by the registry, context resolution and the docs layer.
3
+ * `capabilities.ts` re-exports them under the names the plan uses (§6.1);
4
+ * they live here so `context/` and `docs/` can import them without a cycle.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ export const CLI_PACKAGE = '@adaptabletools/adaptable-mcp';
8
+ /** Oldest major with change records (`data/changes/<N-1>-<N>.json`). */
9
+ export const RECORDS_FLOOR = 21;
10
+ /** Oldest major `migrate state` accepts as `--from`. */
11
+ export const MIGRATION_FLOOR = 16;
12
+ /** The library package whose `types.d.ts`, `aql` and `upgrade` entries the checks use (plan §7.3). */
13
+ export const LIBRARY_PACKAGE = '@adaptabletools/adaptable';
14
+ /** Oldest major whose package carries the `aql` and `upgrade` entries — the engine is always ≥ this (plan §7.3). */
15
+ export const ENGINE_FLOOR = 24;
16
+ /**
17
+ * The docs host for the current major (plan §7.4, decision 7 of the implementation file).
18
+ * Never switched at release; other hosts are reached through `--docs-host` / `ADAPTABLE_MCP_DOCS_HOST`.
19
+ */
20
+ export const CURRENT_DOCS_HOST = 'https://www.adaptabletools.com';
21
+ /** Environment variable that overrides the docs host for one invocation. */
22
+ export const DOCS_HOST_ENV = 'ADAPTABLE_MCP_DOCS_HOST';
23
+ /**
24
+ * The npm range skills use to invoke the CLI, derived from the package's own
25
+ * version: `^<major>` for a stable version, the prerelease dist-tag
26
+ * (`canary`) for a `-canary.N` prerelease — `^1` would match neither `0.x`
27
+ * nor prereleases (§6.1).
28
+ */
29
+ export function cliRangeFor(version) {
30
+ const prerelease = version.match(/-([0-9A-Za-z]+)(?:[.-]|$)/);
31
+ if (prerelease) {
32
+ return prerelease[1];
33
+ }
34
+ return `^${version.split('.')[0]}`;
35
+ }
36
+ export const PACKAGE_VERSION = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;
37
+ export const CLI_RANGE = cliRangeFor(PACKAGE_VERSION);
38
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG,+BAA+B,CAAC;AAE3D,wEAAwE;AACxE,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,wDAAwD;AACxD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,sGAAsG;AACtG,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAE3D,oHAAoH;AACpH,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gCAAgC,CAAC;AAElE,4EAA4E;AAC5E,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC9D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAC1B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAChF,CAAC,OAAO,CAAC;AAEV,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * `adaptable detect [--all-projects]` · MCP `detect_environment` (plan §8.1).
3
+ */
4
+ import { z } from 'zod';
5
+ import { registerCapability } from '../capabilities.js';
6
+ import { getManifestInfo } from '../compat/manifest.js';
7
+ import { FRAMEWORKS } from '../docs/corpus.js';
8
+ import { ok } from '../envelope.js';
9
+ import { detect } from './detect.js';
10
+ const VersionPair = z.object({ range: z.string().optional(), installed: z.string().optional() });
11
+ export const ProjectReportSchema = z.object({
12
+ path: z.string(),
13
+ packageManager: z.enum(['npm', 'yarn', 'pnpm', 'bun']).optional(),
14
+ adaptable: z.object({ range: z.string().optional(), installed: z.string().optional(), major: z.number().optional() }),
15
+ wrapper: z
16
+ .object({ name: z.string(), range: z.string().optional(), installed: z.string().optional(), skew: z.boolean() })
17
+ .optional(),
18
+ agGrid: z
19
+ .object({
20
+ name: z.string(),
21
+ range: z.string().optional(),
22
+ installed: z.string().optional(),
23
+ major: z.number().optional(),
24
+ enterprise: z.boolean(),
25
+ compatible: z.boolean().optional(),
26
+ requiredByTarget: z.string().optional(),
27
+ })
28
+ .optional(),
29
+ framework: z.enum(FRAMEWORKS),
30
+ frameworkVersions: z.record(z.string(), VersionPair),
31
+ typescript: VersionPair.optional(),
32
+ node: z.object({ engines: z.string().optional(), nvmrc: z.string().optional() }).optional(),
33
+ licensePresent: z.boolean(),
34
+ rowModelHints: z.array(z.string()),
35
+ entryPoints: z.array(z.string()),
36
+ initialStateLiterals: z.array(z.string()),
37
+ columnDefsFiles: z.array(z.string()),
38
+ agGridModulesFile: z.string().optional(),
39
+ plugins: z.array(z.string()),
40
+ companionSkills: z.object({ agDev: z.boolean(), agUpdate: z.boolean() }),
41
+ });
42
+ const DetectOutput = z.object({
43
+ projects: z.array(ProjectReportSchema),
44
+ agGridOnly: z.boolean(),
45
+ latest: z
46
+ .object({ adaptableMajor: z.number(), requiredAgGrid: z.string().optional(), docsHost: z.string() })
47
+ .optional(),
48
+ });
49
+ function projectMarkdown(project) {
50
+ const lines = [`## ${project.path}`, ''];
51
+ const versions = (pair) => pair ? `${pair.installed ?? 'not installed'}${pair.range ? ` (declared ${pair.range})` : ''}` : '—';
52
+ lines.push(`- AdapTable: ${versions(project.adaptable)}${project.adaptable.major !== undefined ? `, major ${project.adaptable.major}` : ''}`);
53
+ if (project.wrapper) {
54
+ lines.push(`- Wrapper: ${project.wrapper.name} ${versions(project.wrapper)}${project.wrapper.skew ? ' — version skew with the core package' : ''}`);
55
+ }
56
+ lines.push(`- AG Grid: ${project.agGrid ? `${project.agGrid.name} ${versions(project.agGrid)}${project.agGrid.compatible === false ? ' — not the documented pairing' : ''}` : 'not declared'}`);
57
+ lines.push(`- Framework: ${project.framework}${Object.keys(project.frameworkVersions).length ? ` (${Object.entries(project.frameworkVersions).map(([n, v]) => `${n} ${versions(v)}`).join(', ')})` : ''}`);
58
+ if (project.typescript) {
59
+ lines.push(`- TypeScript: ${versions(project.typescript)}`);
60
+ }
61
+ if (project.packageManager) {
62
+ lines.push(`- Package manager: ${project.packageManager}`);
63
+ }
64
+ lines.push(`- Licence key in sources: ${project.licensePresent ? 'yes' : 'no'}`);
65
+ if (project.rowModelHints.length) {
66
+ lines.push(`- Row models: ${project.rowModelHints.join(', ')}`);
67
+ }
68
+ const files = (label, list) => {
69
+ if (list.length) {
70
+ lines.push(`- ${label}: ${list.map((f) => `\`${f}\``).join(', ')}`);
71
+ }
72
+ };
73
+ files('Entry points', project.entryPoints);
74
+ files('Initial State literals', project.initialStateLiterals);
75
+ files('columnDefs files', project.columnDefsFiles);
76
+ if (project.agGridModulesFile) {
77
+ lines.push(`- AG Grid modules: \`${project.agGridModulesFile}\``);
78
+ }
79
+ files('Plugins', project.plugins);
80
+ lines.push(`- Companion skills: ag-dev ${project.companionSkills.agDev ? 'installed' : 'missing'}, ag-update ${project.companionSkills.agUpdate ? 'installed' : 'missing'}`);
81
+ return lines.join('\n');
82
+ }
83
+ registerCapability({
84
+ name: 'detect',
85
+ description: 'Detects the AdapTable projects at or below the folder: versions, framework, AG Grid, source layout hints.',
86
+ cli: { command: ['detect'] },
87
+ mcp: { tool: 'detect_environment', stdioOnly: true },
88
+ input: z.object({
89
+ allProjects: z.boolean().optional().describe('Describe every project found instead of requiring a single one'),
90
+ }),
91
+ output: DetectOutput,
92
+ run: async (input, ctx) => {
93
+ const manifest = await getManifestInfo({ offline: ctx.globals.offline, docsHost: ctx.globals.docsHost });
94
+ const { report, warnings } = detect(ctx.cwd, { allProjects: input.allProjects, manifest });
95
+ const context = report.projects.length === 1 ? (await ctx.resolveContext()).context : undefined;
96
+ return ok(report, { warnings, resolvedContext: context });
97
+ },
98
+ markdown: (data) => {
99
+ const parts = data.projects.map(projectMarkdown);
100
+ if (data.latest) {
101
+ parts.push(`_Latest AdapTable: ${data.latest.adaptableMajor}${data.latest.requiredAgGrid ? `, requires AG Grid ${data.latest.requiredAgGrid}` : ''} · docs ${data.latest.docsHost}_`);
102
+ }
103
+ return parts.join('\n\n');
104
+ },
105
+ });
106
+ //# sourceMappingURL=capabilities.js.map