@seamward/cli 0.1.0-alpha.9

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 (46) hide show
  1. package/LICENSE +31 -0
  2. package/README.md +428 -0
  3. package/dist/cli.d.ts +11 -0
  4. package/dist/cli.js +659 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/connection-key.d.ts +6 -0
  7. package/dist/connection-key.js +13 -0
  8. package/dist/connection-key.js.map +1 -0
  9. package/dist/contract-sync.d.ts +134 -0
  10. package/dist/contract-sync.js +603 -0
  11. package/dist/contract-sync.js.map +1 -0
  12. package/dist/discovery.d.ts +47 -0
  13. package/dist/discovery.js +496 -0
  14. package/dist/discovery.js.map +1 -0
  15. package/dist/existing-webhook-binding.d.ts +9 -0
  16. package/dist/existing-webhook-binding.js +196 -0
  17. package/dist/existing-webhook-binding.js.map +1 -0
  18. package/dist/index.d.ts +9 -0
  19. package/dist/index.js +10 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/observation-sync.d.ts +28 -0
  22. package/dist/observation-sync.js +101 -0
  23. package/dist/observation-sync.js.map +1 -0
  24. package/dist/project-metadata.d.ts +7 -0
  25. package/dist/project-metadata.js +104 -0
  26. package/dist/project-metadata.js.map +1 -0
  27. package/dist/remote-api.d.ts +10 -0
  28. package/dist/remote-api.js +61 -0
  29. package/dist/remote-api.js.map +1 -0
  30. package/dist/setup-engine.d.ts +127 -0
  31. package/dist/setup-engine.js +765 -0
  32. package/dist/setup-engine.js.map +1 -0
  33. package/dist/setup-plan.d.ts +197 -0
  34. package/dist/setup-plan.js +1240 -0
  35. package/dist/setup-plan.js.map +1 -0
  36. package/dist/source-instrumentation.d.ts +10 -0
  37. package/dist/source-instrumentation.js +291 -0
  38. package/dist/source-instrumentation.js.map +1 -0
  39. package/dist/version.d.ts +1 -0
  40. package/dist/version.js +8 -0
  41. package/dist/version.js.map +1 -0
  42. package/examples/node-service/README.md +42 -0
  43. package/examples/node-service/contracts/orders.openapi.yaml +18 -0
  44. package/examples/node-service/package.json +11 -0
  45. package/examples/node-service/src/server.ts +13 -0
  46. package/package.json +58 -0
@@ -0,0 +1,47 @@
1
+ export type DiscoveryLanguage = "typescript" | "javascript" | "python" | "php" | "go";
2
+ export type DiscoveryProtocol = "http" | "webhook" | "queue" | "scheduled_feed";
3
+ export type DiscoveryDirection = "inbound" | "outbound";
4
+ export type DiscoveryKind = "http_client" | "http_server" | "webhook_handler" | "queue_publish" | "queue_consume" | "scheduled_feed";
5
+ export type DiscoveryConfidence = "high" | "medium";
6
+ export interface SourceInput {
7
+ path: string;
8
+ content: string;
9
+ }
10
+ export interface DiscoveryFinding {
11
+ id: string;
12
+ file: string;
13
+ line: number;
14
+ language: DiscoveryLanguage;
15
+ protocol: DiscoveryProtocol;
16
+ direction: DiscoveryDirection;
17
+ kind: DiscoveryKind;
18
+ confidence: DiscoveryConfidence;
19
+ detector: string;
20
+ fileFingerprint: string;
21
+ targetHint?: string;
22
+ }
23
+ export interface ContractArtifact {
24
+ file: string;
25
+ format: "openapi" | "json_schema";
26
+ operationCount: number | null;
27
+ fingerprint: string;
28
+ }
29
+ export interface DiscoveryResult {
30
+ schemaVersion: "0.2";
31
+ repositoryFingerprint: string;
32
+ scanPolicyVersion: "seamward-scan/1";
33
+ scannedFiles: number;
34
+ skippedFiles: number;
35
+ languages: DiscoveryLanguage[];
36
+ findings: DiscoveryFinding[];
37
+ contracts: ContractArtifact[];
38
+ }
39
+ export interface ScanProjectOptions {
40
+ maxFileBytes?: number;
41
+ maxFiles?: number;
42
+ maxTotalBytes?: number;
43
+ }
44
+ export declare function discoverSources(sources: SourceInput[], metadata?: {
45
+ skippedFiles?: number;
46
+ }): DiscoveryResult;
47
+ export declare function scanProject(rootDirectory: string, options?: ScanProjectOptions): Promise<DiscoveryResult>;
@@ -0,0 +1,496 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile, readdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import ignore from "ignore";
5
+ const sourceExtensions = new Set([
6
+ ".cjs",
7
+ ".go",
8
+ ".js",
9
+ ".json",
10
+ ".jsx",
11
+ ".mjs",
12
+ ".php",
13
+ ".py",
14
+ ".ts",
15
+ ".tsx",
16
+ ".yaml",
17
+ ".yml",
18
+ ]);
19
+ const ignoredDirectoryNames = new Set([
20
+ ".git",
21
+ ".next",
22
+ ".seamward",
23
+ ".venv",
24
+ "__pycache__",
25
+ "build",
26
+ "coverage",
27
+ "dist",
28
+ "node_modules",
29
+ "target",
30
+ "vendor",
31
+ "venv",
32
+ ]);
33
+ const ignoredFilePatterns = [
34
+ /^\.env(?:\.|$)/i,
35
+ /(?:^|[._-])credentials?(?:[._-]|$)/i,
36
+ /(?:^|[._-])secrets?(?:[._-]|$)/i,
37
+ /\.(?:der|key|p12|pem|pfx)$/i,
38
+ ];
39
+ const defaultIgnoredPaths = [
40
+ "**/__tests__/**",
41
+ "**/fixtures/**",
42
+ "**/mocks/**",
43
+ "**/scripts/**",
44
+ "**/test/**",
45
+ "**/tests/**",
46
+ "**/tools/**",
47
+ "**/*-simulator.*",
48
+ "**/*.simulator.*",
49
+ "**/*.test.*",
50
+ "**/*.spec.*",
51
+ ];
52
+ const rules = {
53
+ typescript: [
54
+ {
55
+ pattern: /\b(?:fetch|axios\.(?:get|post|put|patch|delete|request)|got\.(?:get|post|put|patch|delete)|request)\s*\(/i,
56
+ protocol: "http",
57
+ direction: "outbound",
58
+ kind: "http_client",
59
+ confidence: "high",
60
+ detector: "typescript.http-client",
61
+ },
62
+ {
63
+ pattern: /\b(?:app|router|server)\.(?:get|post|put|patch|delete|all|use)\s*\(/i,
64
+ protocol: "http",
65
+ direction: "inbound",
66
+ kind: "http_server",
67
+ confidence: "high",
68
+ detector: "typescript.http-server",
69
+ },
70
+ {
71
+ pattern: /\b[\w$]*(?:queue|topic|producer|publisher)[\w$]*\.(?:send|publish|add|emit)\s*\(/i,
72
+ protocol: "queue",
73
+ direction: "outbound",
74
+ kind: "queue_publish",
75
+ confidence: "high",
76
+ detector: "typescript.queue-publish",
77
+ },
78
+ {
79
+ pattern: /\b[\w$]*(?:queue|topic|consumer|subscriber)[\w$]*\.(?:process|consume|subscribe|onMessage)\s*\(/i,
80
+ protocol: "queue",
81
+ direction: "inbound",
82
+ kind: "queue_consume",
83
+ confidence: "high",
84
+ detector: "typescript.queue-consume",
85
+ },
86
+ {
87
+ pattern: /\b(?:cron|schedule|scheduler)\.(?:schedule|every|addJob|addFunc)\s*\(/i,
88
+ protocol: "scheduled_feed",
89
+ direction: "outbound",
90
+ kind: "scheduled_feed",
91
+ confidence: "high",
92
+ detector: "typescript.scheduled-feed",
93
+ },
94
+ ],
95
+ javascript: [],
96
+ python: [
97
+ {
98
+ pattern: /\b(?:requests|httpx)\.(?:get|post|put|patch|delete|request)\s*\(|\baiohttp\.ClientSession\s*\(/i,
99
+ protocol: "http",
100
+ direction: "outbound",
101
+ kind: "http_client",
102
+ confidence: "high",
103
+ detector: "python.http-client",
104
+ },
105
+ {
106
+ pattern: /@(?:app|router|blueprint)\.(?:get|post|put|patch|delete|route)\s*\(/i,
107
+ protocol: "http",
108
+ direction: "inbound",
109
+ kind: "http_server",
110
+ confidence: "high",
111
+ detector: "python.http-server",
112
+ },
113
+ {
114
+ pattern: /\b(?:celery|app)\.send_task\s*\(|\.apply_async\s*\(|\.delay\s*\(/i,
115
+ protocol: "queue",
116
+ direction: "outbound",
117
+ kind: "queue_publish",
118
+ confidence: "high",
119
+ detector: "python.queue-publish",
120
+ },
121
+ {
122
+ pattern: /@(?:celery|app)\.task\b|\b(?:consumer|worker)\.subscribe\s*\(/i,
123
+ protocol: "queue",
124
+ direction: "inbound",
125
+ kind: "queue_consume",
126
+ confidence: "high",
127
+ detector: "python.queue-consume",
128
+ },
129
+ {
130
+ pattern: /\b(?:schedule\.every\s*\(|scheduler\.add_job\s*\(|cron\.add_job\s*\()/i,
131
+ protocol: "scheduled_feed",
132
+ direction: "outbound",
133
+ kind: "scheduled_feed",
134
+ confidence: "high",
135
+ detector: "python.scheduled-feed",
136
+ },
137
+ ],
138
+ php: [
139
+ {
140
+ pattern: /\bHttp::(?:get|post|put|patch|delete|send)\s*\(|->request\s*\(/i,
141
+ protocol: "http",
142
+ direction: "outbound",
143
+ kind: "http_client",
144
+ confidence: "high",
145
+ detector: "php.http-client",
146
+ },
147
+ {
148
+ pattern: /\bRoute::(?:get|post|put|patch|delete|any)\s*\(/i,
149
+ protocol: "http",
150
+ direction: "inbound",
151
+ kind: "http_server",
152
+ confidence: "high",
153
+ detector: "php.http-server",
154
+ },
155
+ {
156
+ pattern: /::dispatch(?:Sync|AfterResponse)?\s*\(|\bQueue::push\s*\(/i,
157
+ protocol: "queue",
158
+ direction: "outbound",
159
+ kind: "queue_publish",
160
+ confidence: "high",
161
+ detector: "php.queue-publish",
162
+ },
163
+ {
164
+ pattern: /\bQueue::(?:pop|laterOn)\s*\(|\bfunction\s+handle\s*\(/i,
165
+ protocol: "queue",
166
+ direction: "inbound",
167
+ kind: "queue_consume",
168
+ confidence: "medium",
169
+ detector: "php.queue-consume",
170
+ },
171
+ {
172
+ pattern: /\bSchedule::(?:command|call|job|exec)\s*\(|->(?:hourly|daily|weekly|cron)\s*\(/i,
173
+ protocol: "scheduled_feed",
174
+ direction: "outbound",
175
+ kind: "scheduled_feed",
176
+ confidence: "high",
177
+ detector: "php.scheduled-feed",
178
+ },
179
+ ],
180
+ go: [
181
+ {
182
+ pattern: /\bhttp\.(?:NewRequest|Get|Post)\s*\(|\b[\w]+\.Do\s*\(/,
183
+ protocol: "http",
184
+ direction: "outbound",
185
+ kind: "http_client",
186
+ confidence: "high",
187
+ detector: "go.http-client",
188
+ },
189
+ {
190
+ pattern: /\b(?:http\.)?HandleFunc\s*\(|\b[\w]+\.(?:GET|POST|PUT|PATCH|DELETE)\s*\(/,
191
+ protocol: "http",
192
+ direction: "inbound",
193
+ kind: "http_server",
194
+ confidence: "high",
195
+ detector: "go.http-server",
196
+ },
197
+ {
198
+ pattern: /\b(?:WriteMessages|Publish|Produce)\s*\(/,
199
+ protocol: "queue",
200
+ direction: "outbound",
201
+ kind: "queue_publish",
202
+ confidence: "high",
203
+ detector: "go.queue-publish",
204
+ },
205
+ {
206
+ pattern: /\b(?:ReadMessage|Consume|Subscribe)\s*\(/,
207
+ protocol: "queue",
208
+ direction: "inbound",
209
+ kind: "queue_consume",
210
+ confidence: "high",
211
+ detector: "go.queue-consume",
212
+ },
213
+ {
214
+ pattern: /\b(?:cron|scheduler)\.(?:AddFunc|Schedule|Every)\s*\(/i,
215
+ protocol: "scheduled_feed",
216
+ direction: "outbound",
217
+ kind: "scheduled_feed",
218
+ confidence: "high",
219
+ detector: "go.scheduled-feed",
220
+ },
221
+ ],
222
+ };
223
+ rules.javascript = rules.typescript.map((rule) => ({
224
+ ...rule,
225
+ detector: rule.detector.replace("typescript", "javascript"),
226
+ }));
227
+ function languageForFile(file) {
228
+ switch (path.extname(file).toLowerCase()) {
229
+ case ".ts":
230
+ case ".tsx":
231
+ return "typescript";
232
+ case ".cjs":
233
+ case ".js":
234
+ case ".jsx":
235
+ case ".mjs":
236
+ return "javascript";
237
+ case ".py":
238
+ return "python";
239
+ case ".php":
240
+ return "php";
241
+ case ".go":
242
+ return "go";
243
+ default:
244
+ return null;
245
+ }
246
+ }
247
+ function normalizedFile(file) {
248
+ return file.split(path.sep).join("/").replace(/^\.\//, "");
249
+ }
250
+ function stableFindingId(file, line, rule) {
251
+ return `op_${createHash("sha256")
252
+ .update(`${file}:${line}:${rule.protocol}:${rule.direction}:${rule.kind}`)
253
+ .digest("hex")
254
+ .slice(0, 16)}`;
255
+ }
256
+ function extractTargetHint(line) {
257
+ const literal = line.match(/["']([^"']{1,300})["']/)?.[1];
258
+ if (!literal)
259
+ return undefined;
260
+ if (literal.startsWith("/"))
261
+ return "/<redacted-path>";
262
+ try {
263
+ const url = new URL(literal);
264
+ return `${url.protocol}//${url.host}${url.pathname === "/" ? "/" : "/<redacted-path>"}`;
265
+ }
266
+ catch {
267
+ return undefined;
268
+ }
269
+ }
270
+ function operationFinding(file, language, line, lineNumber, rule, fileFingerprint) {
271
+ const webhook = rule.kind === "http_server" && /["'][^"']*webhooks?\b/i.test(line);
272
+ const effectiveRule = webhook
273
+ ? {
274
+ ...rule,
275
+ protocol: "webhook",
276
+ kind: "webhook_handler",
277
+ detector: `${language}.webhook-handler`,
278
+ }
279
+ : rule;
280
+ const finding = {
281
+ id: stableFindingId(file, lineNumber, effectiveRule),
282
+ file,
283
+ line: lineNumber,
284
+ language,
285
+ protocol: effectiveRule.protocol,
286
+ direction: effectiveRule.direction,
287
+ kind: effectiveRule.kind,
288
+ confidence: effectiveRule.confidence,
289
+ detector: effectiveRule.detector,
290
+ fileFingerprint,
291
+ };
292
+ const targetHint = extractTargetHint(line);
293
+ if (targetHint)
294
+ finding.targetHint = targetHint;
295
+ return finding;
296
+ }
297
+ function detectContract(source) {
298
+ const file = normalizedFile(source.path);
299
+ const extension = path.extname(file).toLowerCase();
300
+ if (extension === ".json") {
301
+ try {
302
+ const parsed = JSON.parse(source.content);
303
+ if (typeof parsed.openapi === "string") {
304
+ const operationMethods = new Set([
305
+ "delete",
306
+ "get",
307
+ "head",
308
+ "options",
309
+ "patch",
310
+ "post",
311
+ "put",
312
+ "trace",
313
+ ]);
314
+ const operationCount = [parsed.paths, parsed.webhooks].reduce((total, collection) => {
315
+ if (typeof collection !== "object" || collection === null) {
316
+ return total;
317
+ }
318
+ return (total +
319
+ Object.values(collection).reduce((count, item) => {
320
+ if (typeof item !== "object" || item === null)
321
+ return count;
322
+ return (count +
323
+ Object.keys(item).filter((key) => operationMethods.has(key.toLowerCase())).length);
324
+ }, 0));
325
+ }, 0);
326
+ return {
327
+ file,
328
+ format: "openapi",
329
+ operationCount,
330
+ fingerprint: `sha256:${createHash("sha256").update(source.content).digest("hex")}`,
331
+ };
332
+ }
333
+ if (/\.schema\.json$/i.test(file) ||
334
+ (typeof parsed.$schema === "string" &&
335
+ /json-schema\.org/i.test(parsed.$schema))) {
336
+ return {
337
+ file,
338
+ format: "json_schema",
339
+ operationCount: null,
340
+ fingerprint: `sha256:${createHash("sha256").update(source.content).digest("hex")}`,
341
+ };
342
+ }
343
+ }
344
+ catch {
345
+ return null;
346
+ }
347
+ }
348
+ if (extension === ".yaml" || extension === ".yml") {
349
+ if (/^\s*openapi\s*:/m.test(source.content)) {
350
+ const operationCount = Array.from(source.content.matchAll(/^\s+(?:get|post|put|patch|delete|head|options|trace)\s*:/gim)).length;
351
+ return {
352
+ file,
353
+ format: "openapi",
354
+ operationCount,
355
+ fingerprint: `sha256:${createHash("sha256").update(source.content).digest("hex")}`,
356
+ };
357
+ }
358
+ if (/^\s*\$schema\s*:/m.test(source.content)) {
359
+ return {
360
+ file,
361
+ format: "json_schema",
362
+ operationCount: null,
363
+ fingerprint: `sha256:${createHash("sha256").update(source.content).digest("hex")}`,
364
+ };
365
+ }
366
+ }
367
+ return null;
368
+ }
369
+ function compareFindings(left, right) {
370
+ const fileOrder = left.file < right.file ? -1 : left.file > right.file ? 1 : 0;
371
+ const kindOrder = left.kind < right.kind ? -1 : left.kind > right.kind ? 1 : 0;
372
+ return fileOrder || left.line - right.line || kindOrder;
373
+ }
374
+ function compareFiles(left, right) {
375
+ return left.file < right.file ? -1 : left.file > right.file ? 1 : 0;
376
+ }
377
+ export function discoverSources(sources, metadata = {}) {
378
+ const findings = [];
379
+ const contracts = [];
380
+ const languages = new Set();
381
+ for (const source of [...sources].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0)) {
382
+ const file = normalizedFile(source.path);
383
+ const fileFingerprint = `sha256:${createHash("sha256").update(source.content).digest("hex")}`;
384
+ const contract = detectContract({ ...source, path: file });
385
+ if (contract)
386
+ contracts.push(contract);
387
+ const language = languageForFile(file);
388
+ if (!language)
389
+ continue;
390
+ languages.add(language);
391
+ const lines = source.content.split(/\r?\n/);
392
+ lines.forEach((line, index) => {
393
+ for (const rule of rules[language]) {
394
+ if (rule.pattern.test(line)) {
395
+ findings.push(operationFinding(file, language, line, index + 1, rule, fileFingerprint));
396
+ }
397
+ }
398
+ });
399
+ }
400
+ return {
401
+ schemaVersion: "0.2",
402
+ repositoryFingerprint: `sha256:${createHash("sha256")
403
+ .update("seamward-scan/1\0")
404
+ .update([...sources]
405
+ .map((source) => ({
406
+ file: normalizedFile(source.path),
407
+ fingerprint: createHash("sha256")
408
+ .update(source.content)
409
+ .digest("hex"),
410
+ }))
411
+ .sort((left, right) => left.file.localeCompare(right.file))
412
+ .map(({ file, fingerprint }) => `${file}\0${fingerprint}`)
413
+ .join("\0"))
414
+ .digest("hex")}`,
415
+ scanPolicyVersion: "seamward-scan/1",
416
+ scannedFiles: sources.length,
417
+ skippedFiles: metadata.skippedFiles ?? 0,
418
+ languages: [...languages].sort(),
419
+ findings: findings.sort(compareFindings),
420
+ contracts: contracts.sort(compareFiles),
421
+ };
422
+ }
423
+ function shouldIgnoreFile(name) {
424
+ return ignoredFilePatterns.some((pattern) => pattern.test(name));
425
+ }
426
+ function isBinary(content) {
427
+ return content.subarray(0, Math.min(content.length, 8_192)).includes(0);
428
+ }
429
+ export async function scanProject(rootDirectory, options = {}) {
430
+ const root = path.resolve(rootDirectory);
431
+ const maxFileBytes = options.maxFileBytes ?? 1_000_000;
432
+ const maxFiles = options.maxFiles ?? 20_000;
433
+ const maxTotalBytes = options.maxTotalBytes ?? 50_000_000;
434
+ const sources = [];
435
+ let totalBytes = 0;
436
+ let skippedFiles = 0;
437
+ const pathIgnore = ignore().add(defaultIgnoredPaths);
438
+ try {
439
+ pathIgnore.add(await readFile(path.join(root, ".gitignore"), "utf8"));
440
+ }
441
+ catch (error) {
442
+ if (error.code !== "ENOENT")
443
+ throw error;
444
+ }
445
+ async function visit(directory) {
446
+ const entries = await readdir(directory, { withFileTypes: true });
447
+ entries.sort((left, right) => left.name.localeCompare(right.name));
448
+ for (const entry of entries) {
449
+ const absolutePath = path.join(directory, entry.name);
450
+ const relativePath = normalizedFile(path.relative(root, absolutePath));
451
+ if (pathIgnore.ignores(`${relativePath}${entry.isDirectory() ? "/" : ""}`)) {
452
+ skippedFiles += 1;
453
+ continue;
454
+ }
455
+ if (entry.isSymbolicLink()) {
456
+ skippedFiles += 1;
457
+ continue;
458
+ }
459
+ if (entry.isDirectory()) {
460
+ if (ignoredDirectoryNames.has(entry.name) ||
461
+ (entry.name.startsWith(".") && entry.name !== ".well-known")) {
462
+ skippedFiles += 1;
463
+ continue;
464
+ }
465
+ await visit(absolutePath);
466
+ continue;
467
+ }
468
+ if (!entry.isFile())
469
+ continue;
470
+ const extension = path.extname(entry.name).toLowerCase();
471
+ if (shouldIgnoreFile(entry.name) || !sourceExtensions.has(extension)) {
472
+ skippedFiles += 1;
473
+ continue;
474
+ }
475
+ const content = await readFile(absolutePath);
476
+ if (content.byteLength > maxFileBytes || isBinary(content)) {
477
+ skippedFiles += 1;
478
+ continue;
479
+ }
480
+ if (sources.length + 1 > maxFiles) {
481
+ throw new Error(`Repository scan file limit exceeded (${maxFiles})`);
482
+ }
483
+ if (totalBytes + content.byteLength > maxTotalBytes) {
484
+ throw new Error(`Repository scan byte limit exceeded (${maxTotalBytes})`);
485
+ }
486
+ totalBytes += content.byteLength;
487
+ sources.push({
488
+ path: relativePath,
489
+ content: content.toString("utf8"),
490
+ });
491
+ }
492
+ }
493
+ await visit(root);
494
+ return discoverSources(sources, { skippedFiles });
495
+ }
496
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ExistingWebhookBinding {
2
+ marker: string;
3
+ }
4
+ export declare function findExistingWebhookBinding(input: {
5
+ file: string;
6
+ content: string;
7
+ line: number;
8
+ targetHint?: string;
9
+ }): ExistingWebhookBinding | null;