@relayfile/adapter-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +89 -0
  2. package/dist/src/cli.d.ts +3 -0
  3. package/dist/src/cli.d.ts.map +1 -0
  4. package/dist/src/cli.js +430 -0
  5. package/dist/src/cli.js.map +1 -0
  6. package/dist/src/docs/change-detector.d.ts +23 -0
  7. package/dist/src/docs/change-detector.d.ts.map +1 -0
  8. package/dist/src/docs/change-detector.js +126 -0
  9. package/dist/src/docs/change-detector.js.map +1 -0
  10. package/dist/src/docs/crawler.d.ts +22 -0
  11. package/dist/src/docs/crawler.d.ts.map +1 -0
  12. package/dist/src/docs/crawler.js +296 -0
  13. package/dist/src/docs/crawler.js.map +1 -0
  14. package/dist/src/docs/extractor.d.ts +12 -0
  15. package/dist/src/docs/extractor.d.ts.map +1 -0
  16. package/dist/src/docs/extractor.js +549 -0
  17. package/dist/src/docs/extractor.js.map +1 -0
  18. package/dist/src/docs/generator.d.ts +14 -0
  19. package/dist/src/docs/generator.d.ts.map +1 -0
  20. package/dist/src/docs/generator.js +368 -0
  21. package/dist/src/docs/generator.js.map +1 -0
  22. package/dist/src/docs/mapping-generator.d.ts +13 -0
  23. package/dist/src/docs/mapping-generator.d.ts.map +1 -0
  24. package/dist/src/docs/mapping-generator.js +104 -0
  25. package/dist/src/docs/mapping-generator.js.map +1 -0
  26. package/dist/src/docs/types.d.ts +110 -0
  27. package/dist/src/docs/types.d.ts.map +1 -0
  28. package/dist/src/docs/types.js +2 -0
  29. package/dist/src/docs/types.js.map +1 -0
  30. package/dist/src/docs/updater.d.ts +11 -0
  31. package/dist/src/docs/updater.d.ts.map +1 -0
  32. package/dist/src/docs/updater.js +133 -0
  33. package/dist/src/docs/updater.js.map +1 -0
  34. package/dist/src/drift/drift-checker.d.ts +13 -0
  35. package/dist/src/drift/drift-checker.d.ts.map +1 -0
  36. package/dist/src/drift/drift-checker.js +200 -0
  37. package/dist/src/drift/drift-checker.js.map +1 -0
  38. package/dist/src/generate/adapter-generator.d.ts +4 -0
  39. package/dist/src/generate/adapter-generator.d.ts.map +1 -0
  40. package/dist/src/generate/adapter-generator.js +115 -0
  41. package/dist/src/generate/adapter-generator.js.map +1 -0
  42. package/dist/src/generate/types-generator.d.ts +3 -0
  43. package/dist/src/generate/types-generator.d.ts.map +1 -0
  44. package/dist/src/generate/types-generator.js +105 -0
  45. package/dist/src/generate/types-generator.js.map +1 -0
  46. package/dist/src/index.d.ts +22 -0
  47. package/dist/src/index.d.ts.map +1 -0
  48. package/dist/src/index.js +21 -0
  49. package/dist/src/index.js.map +1 -0
  50. package/dist/src/ingest/index.d.ts +4 -0
  51. package/dist/src/ingest/index.d.ts.map +1 -0
  52. package/dist/src/ingest/index.js +34 -0
  53. package/dist/src/ingest/index.js.map +1 -0
  54. package/dist/src/ingest/openapi.d.ts +8 -0
  55. package/dist/src/ingest/openapi.d.ts.map +1 -0
  56. package/dist/src/ingest/openapi.js +187 -0
  57. package/dist/src/ingest/openapi.js.map +1 -0
  58. package/dist/src/ingest/postman.d.ts +3 -0
  59. package/dist/src/ingest/postman.d.ts.map +1 -0
  60. package/dist/src/ingest/postman.js +14 -0
  61. package/dist/src/ingest/postman.js.map +1 -0
  62. package/dist/src/ingest/sample.d.ts +4 -0
  63. package/dist/src/ingest/sample.d.ts.map +1 -0
  64. package/dist/src/ingest/sample.js +72 -0
  65. package/dist/src/ingest/sample.js.map +1 -0
  66. package/dist/src/ingest/shared.d.ts +6 -0
  67. package/dist/src/ingest/shared.d.ts.map +1 -0
  68. package/dist/src/ingest/shared.js +52 -0
  69. package/dist/src/ingest/shared.js.map +1 -0
  70. package/dist/src/ingest/types.d.ts +44 -0
  71. package/dist/src/ingest/types.d.ts.map +1 -0
  72. package/dist/src/ingest/types.js +2 -0
  73. package/dist/src/ingest/types.js.map +1 -0
  74. package/dist/src/runtime/schema-adapter.d.ts +71 -0
  75. package/dist/src/runtime/schema-adapter.d.ts.map +1 -0
  76. package/dist/src/runtime/schema-adapter.js +887 -0
  77. package/dist/src/runtime/schema-adapter.js.map +1 -0
  78. package/dist/src/spec/parser.d.ts +9 -0
  79. package/dist/src/spec/parser.d.ts.map +1 -0
  80. package/dist/src/spec/parser.js +371 -0
  81. package/dist/src/spec/parser.js.map +1 -0
  82. package/dist/src/spec/template.d.ts +8 -0
  83. package/dist/src/spec/template.d.ts.map +1 -0
  84. package/dist/src/spec/template.js +75 -0
  85. package/dist/src/spec/template.js.map +1 -0
  86. package/dist/src/spec/types.d.ts +88 -0
  87. package/dist/src/spec/types.d.ts.map +1 -0
  88. package/dist/src/spec/types.js +2 -0
  89. package/dist/src/spec/types.js.map +1 -0
  90. package/dist/tests/docs/change-detector.test.d.ts +2 -0
  91. package/dist/tests/docs/change-detector.test.d.ts.map +1 -0
  92. package/dist/tests/docs/change-detector.test.js +24 -0
  93. package/dist/tests/docs/change-detector.test.js.map +1 -0
  94. package/dist/tests/docs/crawler.test.d.ts +2 -0
  95. package/dist/tests/docs/crawler.test.d.ts.map +1 -0
  96. package/dist/tests/docs/crawler.test.js +55 -0
  97. package/dist/tests/docs/crawler.test.js.map +1 -0
  98. package/dist/tests/docs/extractor.test.d.ts +2 -0
  99. package/dist/tests/docs/extractor.test.d.ts.map +1 -0
  100. package/dist/tests/docs/extractor.test.js +63 -0
  101. package/dist/tests/docs/extractor.test.js.map +1 -0
  102. package/dist/tests/docs/generator.test.d.ts +2 -0
  103. package/dist/tests/docs/generator.test.d.ts.map +1 -0
  104. package/dist/tests/docs/generator.test.js +46 -0
  105. package/dist/tests/docs/generator.test.js.map +1 -0
  106. package/dist/tests/drift/drift-checker.test.d.ts +2 -0
  107. package/dist/tests/drift/drift-checker.test.d.ts.map +1 -0
  108. package/dist/tests/drift/drift-checker.test.js +59 -0
  109. package/dist/tests/drift/drift-checker.test.js.map +1 -0
  110. package/dist/tests/round-trip/fake-connection.d.ts +29 -0
  111. package/dist/tests/round-trip/fake-connection.d.ts.map +1 -0
  112. package/dist/tests/round-trip/fake-connection.js +174 -0
  113. package/dist/tests/round-trip/fake-connection.js.map +1 -0
  114. package/dist/tests/round-trip/github-pulls.test.d.ts +2 -0
  115. package/dist/tests/round-trip/github-pulls.test.d.ts.map +1 -0
  116. package/dist/tests/round-trip/github-pulls.test.js +12 -0
  117. package/dist/tests/round-trip/github-pulls.test.js.map +1 -0
  118. package/dist/tests/round-trip/harness.d.ts +74 -0
  119. package/dist/tests/round-trip/harness.d.ts.map +1 -0
  120. package/dist/tests/round-trip/harness.js +323 -0
  121. package/dist/tests/round-trip/harness.js.map +1 -0
  122. package/dist/tests/round-trip/vfs-snapshot.d.ts +45 -0
  123. package/dist/tests/round-trip/vfs-snapshot.d.ts.map +1 -0
  124. package/dist/tests/round-trip/vfs-snapshot.js +218 -0
  125. package/dist/tests/round-trip/vfs-snapshot.js.map +1 -0
  126. package/dist/tests/runtime/schema-adapter.sync.test.d.ts +2 -0
  127. package/dist/tests/runtime/schema-adapter.sync.test.d.ts.map +1 -0
  128. package/dist/tests/runtime/schema-adapter.sync.test.js +962 -0
  129. package/dist/tests/runtime/schema-adapter.sync.test.js.map +1 -0
  130. package/dist/tests/runtime/schema-adapter.test.d.ts +2 -0
  131. package/dist/tests/runtime/schema-adapter.test.d.ts.map +1 -0
  132. package/dist/tests/runtime/schema-adapter.test.js +100 -0
  133. package/dist/tests/runtime/schema-adapter.test.js.map +1 -0
  134. package/dist/tests/spec/parser.test.d.ts +2 -0
  135. package/dist/tests/spec/parser.test.d.ts.map +1 -0
  136. package/dist/tests/spec/parser.test.js +248 -0
  137. package/dist/tests/spec/parser.test.js.map +1 -0
  138. package/mappings/github.mapping.yaml +35 -0
  139. package/mappings/slack.mapping.yaml +18 -0
  140. package/package.json +52 -0
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # @relayfile/adapter-core
2
+
3
+ `@relayfile/adapter-core` replaces hand-written relayfile adapters with a mapping file plus an API spec. It supports runtime execution through `SchemaAdapter`, code generation for zero-dependency adapters, and drift detection against upstream API specs.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @relayfile/adapter-core @relayfile/sdk
9
+ ```
10
+
11
+ ## Mapping Spec
12
+
13
+ ```yaml
14
+ adapter:
15
+ name: github
16
+ version: "1.0.0"
17
+ baseUrl: https://api.github.com
18
+ source:
19
+ openapi: https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.yaml
20
+ webhooks:
21
+ pull_request:
22
+ path: /github/repos/{{repository.owner.login}}/{{repository.name}}/pulls/{{number}}/metadata.json
23
+ writebacks:
24
+ review:
25
+ match: /github/repos/*/*/pulls/*/reviews/*.json
26
+ endpoint: POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews
27
+ ```
28
+
29
+ See [../../docs/MAPPING_YAML_SPEC.md](../../docs/MAPPING_YAML_SPEC.md) for the full mapping YAML specification.
30
+
31
+ ## CLI
32
+
33
+ ```bash
34
+ npx adapter-core init --service github --openapi https://example.com/openapi.yaml
35
+ npx adapter-core validate --spec mappings/github.mapping.yaml
36
+ npx adapter-core generate --spec mappings/github.mapping.yaml --outdir src/generated
37
+ npx adapter-core drift --spec mappings/github.mapping.yaml --baseline src/generated/service-spec.snapshot.json
38
+ npx adapter-core docs-to-spec --url https://docs.example.com/api --out specs --service example
39
+ npx adapter-core docs-check --spec specs/example.openapi.yaml
40
+ npx adapter-core docs-update --spec specs/example.openapi.yaml
41
+ ```
42
+
43
+ ## Docs-To-Spec
44
+
45
+ For APIs that only publish documentation pages, `adapter-core` can crawl those docs, extract API structure with an LLM, and emit both an OpenAPI spec and a mapping file.
46
+
47
+ ```bash
48
+ npx adapter-core docs-to-spec \
49
+ --url https://docs.example.com/api-reference \
50
+ --out ./specs \
51
+ --service example \
52
+ --paths /api-reference/endpoints,/api-reference/webhooks \
53
+ --sync-trigger content-hash
54
+ ```
55
+
56
+ Generated OpenAPI files store crawl metadata in `x-docs-source`. That enables:
57
+
58
+ - `docs-check` to do a cheap hash, RSS, or GitHub-release check before any crawl or LLM call
59
+ - `docs-update` to re-crawl, diff against the current spec, preserve `x-human-edited: true` sections, and mark removed operations as deprecated
60
+
61
+ Generated mapping files use `adapter.source.docs` so the existing runtime and generator pipeline can load documentation-backed adapters the same way it loads OpenAPI or Postman-backed adapters.
62
+
63
+ ## Runtime
64
+
65
+ ```ts
66
+ import { SchemaAdapter, loadMappingSpec } from "@relayfile/adapter-core";
67
+
68
+ const spec = await loadMappingSpec("./mappings/github.mapping.yaml");
69
+ const adapter = new SchemaAdapter({
70
+ client,
71
+ provider,
72
+ spec,
73
+ defaultConnectionId: "conn_123"
74
+ });
75
+ ```
76
+
77
+ ## What It Generates
78
+
79
+ - `adapter.generated.ts`: static mapping logic for path resolution and writeback matching
80
+ - `types.generated.ts`: TypeScript types derived from OpenAPI schemas
81
+ - `service-spec.snapshot.json`: normalized baseline for future drift checks
82
+
83
+ ## Drift Detection
84
+
85
+ `detectDrift()` compares two normalized `ServiceSpec` objects and reports:
86
+
87
+ - breaking changes: removed endpoints, removed fields, required field additions, type changes
88
+ - warnings: possible property renames
89
+ - additions: new endpoints, new schemas, optional field additions
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,430 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { dirname, resolve } from "node:path";
4
+ import YAML from "yaml";
5
+ import { ChangeDetector, defaultSyncConfig, } from "./docs/change-detector.js";
6
+ import { DocsCrawler } from "./docs/crawler.js";
7
+ import { APIExtractor } from "./docs/extractor.js";
8
+ import { SpecGenerator } from "./docs/generator.js";
9
+ import { MappingGenerator } from "./docs/mapping-generator.js";
10
+ import { SpecUpdater } from "./docs/updater.js";
11
+ import { detectDrift } from "./drift/drift-checker.js";
12
+ import { generateAdapterModule } from "./generate/adapter-generator.js";
13
+ import { generateTypeDefinitions } from "./generate/types-generator.js";
14
+ import { loadServiceSpecFromMapping } from "./ingest/index.js";
15
+ import { loadMappingSpec, validateMappingSpec, } from "./spec/parser.js";
16
+ async function main(argv) {
17
+ const [command, ...args] = argv;
18
+ const flags = parseFlags(args);
19
+ switch (command) {
20
+ case "generate":
21
+ await handleGenerate(flags);
22
+ return;
23
+ case "validate":
24
+ await handleValidate(flags);
25
+ return;
26
+ case "drift":
27
+ await handleDrift(flags);
28
+ return;
29
+ case "init":
30
+ await handleInit(flags);
31
+ return;
32
+ case "docs-to-spec":
33
+ await handleDocsToSpec(flags);
34
+ return;
35
+ case "docs-update":
36
+ await handleDocsUpdate(flags);
37
+ return;
38
+ case "docs-check":
39
+ await handleDocsCheck(flags);
40
+ return;
41
+ case "help":
42
+ case undefined:
43
+ printHelp();
44
+ return;
45
+ default:
46
+ throw new Error(`Unknown command "${command}"`);
47
+ }
48
+ }
49
+ async function handleGenerate(flags) {
50
+ const specPath = requireString(flags.spec, "--spec is required");
51
+ const outdir = requireString(flags.outdir, "--outdir is required");
52
+ const mappingSpec = await loadMappingSpec(specPath);
53
+ const cwd = dirname(resolve(specPath));
54
+ const serviceSpec = await loadServiceSpecFromMapping(mappingSpec, cwd);
55
+ const validation = validateMappingSpec(mappingSpec, serviceSpec);
56
+ if (!validation.valid) {
57
+ throw new Error(renderValidation(validation.issues));
58
+ }
59
+ const adapterCode = generateAdapterModule(mappingSpec, serviceSpec);
60
+ const typesCode = generateTypeDefinitions(serviceSpec);
61
+ const outputDir = resolve(outdir);
62
+ await mkdir(outputDir, { recursive: true });
63
+ await writeFile(resolve(outputDir, "adapter.generated.ts"), adapterCode);
64
+ await writeFile(resolve(outputDir, "types.generated.ts"), typesCode);
65
+ await writeFile(resolve(outputDir, "service-spec.snapshot.json"), `${JSON.stringify(serviceSpec, null, 2)}\n`);
66
+ process.stdout.write(`${JSON.stringify({
67
+ command: "generate",
68
+ outdir: outputDir,
69
+ files: [
70
+ "adapter.generated.ts",
71
+ "types.generated.ts",
72
+ "service-spec.snapshot.json",
73
+ ],
74
+ }, null, 2)}\n`);
75
+ }
76
+ async function handleValidate(flags) {
77
+ const specPath = requireString(flags.spec, "--spec is required");
78
+ const mappingSpec = await loadMappingSpec(specPath);
79
+ const cwd = dirname(resolve(specPath));
80
+ const serviceSpec = await loadServiceSpecFromMapping(mappingSpec, cwd);
81
+ const result = validateMappingSpec(mappingSpec, serviceSpec);
82
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
83
+ if (!result.valid) {
84
+ process.exitCode = 1;
85
+ }
86
+ }
87
+ async function handleDrift(flags) {
88
+ const specPath = requireString(flags.spec, "--spec is required");
89
+ const baselinePath = readOptionalString(flags.baseline) ??
90
+ resolve(dirname(resolve(specPath)), ".adapter-core", "service-spec.snapshot.json");
91
+ const mappingSpec = await loadMappingSpec(specPath);
92
+ const cwd = dirname(resolve(specPath));
93
+ const current = await loadServiceSpecFromMapping(mappingSpec, cwd);
94
+ const baseline = await loadSnapshot(baselinePath);
95
+ const report = detectDrift(baseline, current);
96
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
97
+ if (report.breaking.length > 0) {
98
+ process.exitCode = 1;
99
+ }
100
+ }
101
+ async function handleInit(flags) {
102
+ const service = requireString(flags.service, "--service is required");
103
+ const openapi = readOptionalString(flags.openapi);
104
+ const postman = readOptionalString(flags.postman);
105
+ const output = readOptionalString(flags.out) ?? `${service}.mapping.yaml`;
106
+ const spec = {
107
+ adapter: {
108
+ name: service,
109
+ version: "1.0.0",
110
+ source: {
111
+ ...(openapi ? { openapi } : {}),
112
+ ...(postman ? { postman } : {}),
113
+ },
114
+ },
115
+ webhooks: {
116
+ example: {
117
+ path: `/${service}/events/{{id}}.json`,
118
+ },
119
+ },
120
+ resources: {},
121
+ writebacks: {},
122
+ };
123
+ await mkdir(dirname(resolve(output)), { recursive: true });
124
+ await writeFile(resolve(output), YAML.stringify(spec));
125
+ process.stdout.write(`${JSON.stringify({ command: "init", output: resolve(output) }, null, 2)}\n`);
126
+ }
127
+ async function handleDocsToSpec(flags) {
128
+ const url = requireString(flags.url, "--url is required");
129
+ const out = requireString(flags.out, "--out is required");
130
+ const docsSource = parseDocsSourceFlags(flags, url);
131
+ const sync = parseSyncFlags(flags);
132
+ const llm = parseLlmFlags(flags);
133
+ const serviceName = readOptionalString(flags.service) ?? inferServiceName(url);
134
+ const outputDir = resolve(out);
135
+ const pages = await new DocsCrawler(docsSource).crawl();
136
+ const extracted = await new APIExtractor(llm).extract(pages);
137
+ const spec = new SpecGenerator().generate(extracted, {
138
+ apiName: serviceName,
139
+ docsSource,
140
+ sync,
141
+ llm,
142
+ });
143
+ const mapping = new MappingGenerator().generate(extracted, {
144
+ serviceName,
145
+ docsSource,
146
+ sync,
147
+ llm,
148
+ });
149
+ await mkdir(outputDir, { recursive: true });
150
+ const specPath = resolve(outputDir, `${serviceName}.openapi.yaml`);
151
+ const mappingPath = resolve(outputDir, `${serviceName}.mapping.yaml`);
152
+ await writeFile(specPath, spec);
153
+ await writeFile(mappingPath, mapping);
154
+ process.stdout.write(`${JSON.stringify({
155
+ command: "docs-to-spec",
156
+ service: serviceName,
157
+ spec: specPath,
158
+ mapping: mappingPath,
159
+ pages: pages.length,
160
+ endpoints: extracted.endpoints.length,
161
+ webhooks: extracted.webhooks.length,
162
+ }, null, 2)}\n`);
163
+ }
164
+ async function handleDocsUpdate(flags) {
165
+ const specPath = requireString(flags.spec, "--spec is required");
166
+ const specLocation = resolve(specPath);
167
+ const existingSpec = await readFile(specLocation, "utf8");
168
+ const document = asRecord(YAML.parse(existingSpec), "OpenAPI document");
169
+ const metadata = readDocsMetadata(document);
170
+ const detector = new ChangeDetector();
171
+ const syncConfig = defaultSyncConfig(metadata.url, metadata.sync);
172
+ const detectorResult = flags.force === true ? undefined : await detector.check(syncConfig);
173
+ if (detectorResult && !detectorResult.changed) {
174
+ process.stdout.write(`${JSON.stringify({
175
+ command: "docs-update",
176
+ changed: false,
177
+ reason: detectorResult.reason,
178
+ spec: specLocation,
179
+ }, null, 2)}\n`);
180
+ return;
181
+ }
182
+ const pages = await new DocsCrawler({
183
+ url: metadata.url,
184
+ crawlPaths: metadata.crawlPaths,
185
+ selectors: metadata.selectors,
186
+ }).crawl();
187
+ const extracted = await new APIExtractor(metadata.llm).extract(pages);
188
+ const info = asLooseRecord(document.info);
189
+ const updater = new SpecUpdater();
190
+ const result = updater.update({
191
+ existingSpec,
192
+ extracted,
193
+ apiName: typeof info?.title === "string"
194
+ ? info.title
195
+ : inferServiceName(metadata.url),
196
+ apiVersion: typeof info?.version === "string" ? info.version : "1.0.0",
197
+ docsSource: {
198
+ url: metadata.url,
199
+ crawlPaths: metadata.crawlPaths,
200
+ selectors: metadata.selectors,
201
+ },
202
+ sync: metadata.sync,
203
+ llm: metadata.llm,
204
+ serviceNameForMapping: readOptionalString(flags.service) ?? inferServiceName(metadata.url),
205
+ });
206
+ await writeFile(specLocation, result.spec);
207
+ const mappingLocation = readOptionalString(flags.mapping) ?? inferMappingPath(specLocation);
208
+ if (result.mapping) {
209
+ await writeFile(resolve(mappingLocation), result.mapping);
210
+ }
211
+ if (detectorResult) {
212
+ await detector.record(syncConfig, detectorResult);
213
+ }
214
+ process.stdout.write(`${JSON.stringify({
215
+ command: "docs-update",
216
+ changed: result.changed,
217
+ spec: specLocation,
218
+ mapping: resolve(mappingLocation),
219
+ warnings: result.warnings,
220
+ changes: result.changes,
221
+ }, null, 2)}\n`);
222
+ }
223
+ async function handleDocsCheck(flags) {
224
+ const specPath = requireString(flags.spec, "--spec is required");
225
+ const existingSpec = await readFile(resolve(specPath), "utf8");
226
+ const document = asRecord(YAML.parse(existingSpec), "OpenAPI document");
227
+ const metadata = readDocsMetadata(document);
228
+ const detector = new ChangeDetector();
229
+ const config = defaultSyncConfig(metadata.url, metadata.sync);
230
+ const result = await detector.check(config);
231
+ await detector.record(config, result);
232
+ process.stdout.write(`${JSON.stringify({ command: "docs-check", ...result }, null, 2)}\n`);
233
+ }
234
+ function parseFlags(args) {
235
+ const output = {};
236
+ for (let index = 0; index < args.length; index += 1) {
237
+ const arg = args[index];
238
+ if (!arg.startsWith("--")) {
239
+ continue;
240
+ }
241
+ const key = arg.slice(2);
242
+ const next = args[index + 1];
243
+ if (!next || next.startsWith("--")) {
244
+ output[key] = true;
245
+ continue;
246
+ }
247
+ output[key] = next;
248
+ index += 1;
249
+ }
250
+ return output;
251
+ }
252
+ async function loadSnapshot(location) {
253
+ const text = await readFile(resolve(location), "utf8");
254
+ return JSON.parse(text);
255
+ }
256
+ function requireString(value, message) {
257
+ if (typeof value !== "string" || value.trim().length === 0) {
258
+ throw new Error(message);
259
+ }
260
+ return value;
261
+ }
262
+ function readOptionalString(value) {
263
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
264
+ }
265
+ function renderValidation(issues) {
266
+ return issues
267
+ .map((issue) => `${issue.level.toUpperCase()}: ${issue.path}: ${issue.message}`)
268
+ .join("\n");
269
+ }
270
+ function printHelp() {
271
+ process.stdout.write(`adapter-core
272
+
273
+ Commands:
274
+ generate --spec <mapping> --outdir <dir>
275
+ validate --spec <mapping>
276
+ drift --spec <mapping> [--baseline <snapshot>]
277
+ init --service <name> (--openapi <url> | --postman <url>) [--out <file>]
278
+ docs-to-spec --url <docs-url> --out <dir> [--service <name>] [--paths <a,b>]
279
+ docs-update --spec <openapi.yaml> [--mapping <mapping.yaml>] [--force]
280
+ docs-check --spec <openapi.yaml>
281
+ `);
282
+ }
283
+ function parseDocsSourceFlags(flags, url) {
284
+ return {
285
+ url,
286
+ crawlPaths: parseCsv(flags.paths),
287
+ selectors: {
288
+ content: readOptionalString(flags["content-selector"]),
289
+ codeBlock: readOptionalString(flags["code-selector"]),
290
+ },
291
+ };
292
+ }
293
+ function parseSyncFlags(flags) {
294
+ const trigger = readOptionalString(flags["sync-trigger"]);
295
+ if (!trigger) {
296
+ return undefined;
297
+ }
298
+ if (trigger !== "content-hash" &&
299
+ trigger !== "changelog-rss" &&
300
+ trigger !== "github-release") {
301
+ throw new Error("--sync-trigger must be content-hash, changelog-rss, or github-release");
302
+ }
303
+ return {
304
+ trigger,
305
+ feedUrl: readOptionalString(flags["feed-url"]),
306
+ repo: readOptionalString(flags.repo),
307
+ stateFile: readOptionalString(flags["state-file"]),
308
+ };
309
+ }
310
+ function parseLlmFlags(flags) {
311
+ const hasLlmFlag = [
312
+ flags["llm-provider"],
313
+ flags["llm-endpoint"],
314
+ flags["llm-model"],
315
+ flags["llm-max-tokens"],
316
+ flags["llm-concurrency"],
317
+ flags["llm-chunk-size"],
318
+ ].some((value) => value !== undefined);
319
+ if (!hasLlmFlag) {
320
+ return undefined;
321
+ }
322
+ const provider = readOptionalString(flags["llm-provider"]);
323
+ return {
324
+ provider: provider === "anthropic" || provider === "custom" || provider === "openai"
325
+ ? provider
326
+ : undefined,
327
+ endpoint: readOptionalString(flags["llm-endpoint"]),
328
+ model: readOptionalString(flags["llm-model"]),
329
+ maxTokens: readOptionalNumber(flags["llm-max-tokens"]),
330
+ concurrency: readOptionalNumber(flags["llm-concurrency"]),
331
+ chunkSize: readOptionalNumber(flags["llm-chunk-size"]),
332
+ };
333
+ }
334
+ function parseCsv(value) {
335
+ if (typeof value !== "string" || value.trim().length === 0) {
336
+ return undefined;
337
+ }
338
+ const items = value
339
+ .split(",")
340
+ .map((item) => item.trim())
341
+ .filter(Boolean);
342
+ return items.length > 0 ? items : undefined;
343
+ }
344
+ function readOptionalNumber(value) {
345
+ if (typeof value !== "string" || value.trim().length === 0) {
346
+ return undefined;
347
+ }
348
+ const parsed = Number(value);
349
+ return Number.isFinite(parsed) ? parsed : undefined;
350
+ }
351
+ function inferServiceName(url) {
352
+ const parsed = new URL(url);
353
+ const parts = [parsed.hostname.replace(/^www\./, ""), parsed.pathname]
354
+ .join(" ")
355
+ .split(/[^a-zA-Z0-9]+/)
356
+ .filter(Boolean);
357
+ return parts[0]?.toLowerCase() ?? "docs-api";
358
+ }
359
+ function inferMappingPath(specPath) {
360
+ if (/\.openapi\.ya?ml$/i.test(specPath)) {
361
+ return specPath.replace(/\.openapi\.ya?ml$/i, ".mapping.yaml");
362
+ }
363
+ if (/\.ya?ml$/i.test(specPath)) {
364
+ return specPath.replace(/\.ya?ml$/i, ".mapping.yaml");
365
+ }
366
+ return `${specPath}.mapping.yaml`;
367
+ }
368
+ function readDocsMetadata(document) {
369
+ const metadata = asRecord(document["x-docs-source"], "x-docs-source");
370
+ const sync = asLooseRecord(metadata.sync);
371
+ const llm = asLooseRecord(metadata.llm);
372
+ const selectors = asLooseRecord(metadata.selectors);
373
+ return {
374
+ url: requireField(metadata.url, "x-docs-source.url"),
375
+ crawlPaths: Array.isArray(metadata.crawlPaths)
376
+ ? metadata.crawlPaths.filter((item) => typeof item === "string")
377
+ : undefined,
378
+ selectors: selectors
379
+ ? {
380
+ content: typeof selectors.content === "string" ? selectors.content : undefined,
381
+ codeBlock: typeof selectors.codeBlock === "string" ? selectors.codeBlock : undefined,
382
+ pagination: typeof selectors.pagination === "string" ? selectors.pagination : undefined,
383
+ }
384
+ : undefined,
385
+ sync: sync
386
+ ? {
387
+ trigger: requireField(sync.trigger, "x-docs-source.sync.trigger"),
388
+ feedUrl: typeof sync.feedUrl === "string" ? sync.feedUrl : undefined,
389
+ repo: typeof sync.repo === "string" ? sync.repo : undefined,
390
+ }
391
+ : undefined,
392
+ llm: llm
393
+ ? {
394
+ provider: llm.provider === "anthropic" ||
395
+ llm.provider === "custom" ||
396
+ llm.provider === "openai"
397
+ ? llm.provider
398
+ : undefined,
399
+ endpoint: typeof llm.endpoint === "string" ? llm.endpoint : undefined,
400
+ model: typeof llm.model === "string" ? llm.model : undefined,
401
+ maxTokens: typeof llm.maxTokens === "number" ? llm.maxTokens : undefined,
402
+ concurrency: typeof llm.concurrency === "number" ? llm.concurrency : undefined,
403
+ chunkSize: typeof llm.chunkSize === "number" ? llm.chunkSize : undefined,
404
+ }
405
+ : undefined,
406
+ };
407
+ }
408
+ function asRecord(value, label) {
409
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
410
+ throw new Error(`${label} must be an object`);
411
+ }
412
+ return value;
413
+ }
414
+ function asLooseRecord(value) {
415
+ return typeof value === "object" && value !== null && !Array.isArray(value)
416
+ ? value
417
+ : undefined;
418
+ }
419
+ function requireField(value, label) {
420
+ if (typeof value !== "string" || value.trim().length === 0) {
421
+ throw new Error(`${label} is required`);
422
+ }
423
+ return value;
424
+ }
425
+ main(process.argv.slice(2)).catch((error) => {
426
+ const message = error instanceof Error ? error.message : String(error);
427
+ process.stderr.write(`${message}\n`);
428
+ process.exit(1);
429
+ });
430
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ChangeDetectionResult, DocsSyncConfig } from "./types.js";
2
+ export interface ChangeDetectorCheckInput extends DocsSyncConfig {
3
+ url: string;
4
+ githubToken?: string;
5
+ }
6
+ export declare class ChangeDetector {
7
+ private readonly fetchImpl;
8
+ private readonly stateFile;
9
+ constructor(options?: {
10
+ fetchImpl?: typeof fetch;
11
+ stateFile?: string;
12
+ });
13
+ check(input: ChangeDetectorCheckInput): Promise<ChangeDetectionResult>;
14
+ record(input: ChangeDetectorCheckInput, result: Pick<ChangeDetectionResult, "currentHash" | "stateKey">): Promise<void>;
15
+ private getStateKey;
16
+ private readCurrentValue;
17
+ private readContentHash;
18
+ private readFeedValue;
19
+ private readGitHubReleaseValue;
20
+ private loadState;
21
+ }
22
+ export declare function defaultSyncConfig(url: string, sync?: DocsSyncConfig): ChangeDetectorCheckInput;
23
+ //# sourceMappingURL=change-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-detector.d.ts","sourceRoot":"","sources":["../../../src/docs/change-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EAEf,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAKhE,KAAK,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoBtE,MAAM,CACV,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,UAAU,CAAC,GAC9D,OAAO,CAAC,IAAI,CAAC;IAQhB,OAAO,CAAC,WAAW;YAUL,gBAAgB;YAahB,eAAe;YAYf,aAAa;YAsBb,sBAAsB;YA2CtB,SAAS;CASxB;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,cAAc,GACpB,wBAAwB,CAQ1B"}