@kylewadegrove/cutline-mcp-cli 0.4.2 → 0.5.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 (49) hide show
  1. package/Dockerfile +11 -0
  2. package/README.md +177 -107
  3. package/dist/auth/callback.js +30 -32
  4. package/dist/auth/keychain.js +7 -15
  5. package/dist/commands/init.d.ts +4 -0
  6. package/dist/commands/init.js +246 -0
  7. package/dist/commands/login.js +39 -45
  8. package/dist/commands/logout.js +13 -19
  9. package/dist/commands/serve.d.ts +1 -0
  10. package/dist/commands/serve.js +38 -0
  11. package/dist/commands/setup.d.ts +5 -0
  12. package/dist/commands/setup.js +255 -0
  13. package/dist/commands/status.js +29 -35
  14. package/dist/commands/upgrade.js +44 -38
  15. package/dist/index.js +38 -14
  16. package/dist/servers/chunk-7FHM2GD3.js +5836 -0
  17. package/dist/servers/chunk-IVWF7VYZ.js +10086 -0
  18. package/dist/servers/chunk-JBJYSV4P.js +139 -0
  19. package/dist/servers/chunk-KMUSQOTJ.js +47 -0
  20. package/dist/servers/chunk-PD2HN2R5.js +908 -0
  21. package/dist/servers/chunk-PU7TL6S3.js +91 -0
  22. package/dist/servers/chunk-TGSEURMN.js +46 -0
  23. package/dist/servers/chunk-UBBAYTW3.js +946 -0
  24. package/dist/servers/cutline-server.js +11512 -0
  25. package/dist/servers/exploration-server.js +1030 -0
  26. package/dist/servers/graph-metrics-DCNR7JZN.js +12 -0
  27. package/dist/servers/integrations-server.js +121 -0
  28. package/dist/servers/output-server.js +120 -0
  29. package/dist/servers/pipeline-O5GJPNR4.js +20 -0
  30. package/dist/servers/premortem-handoff-XT4K3YDJ.js +10 -0
  31. package/dist/servers/premortem-server.js +958 -0
  32. package/dist/servers/score-history-HO5KRVGC.js +6 -0
  33. package/dist/servers/tools-server.js +291 -0
  34. package/dist/utils/config-store.js +13 -21
  35. package/dist/utils/config.js +2 -6
  36. package/mcpb/manifest.json +77 -0
  37. package/package.json +55 -9
  38. package/server.json +42 -0
  39. package/smithery.yaml +10 -0
  40. package/src/auth/callback.ts +0 -102
  41. package/src/auth/keychain.ts +0 -16
  42. package/src/commands/login.ts +0 -202
  43. package/src/commands/logout.ts +0 -30
  44. package/src/commands/status.ts +0 -153
  45. package/src/commands/upgrade.ts +0 -121
  46. package/src/index.ts +0 -40
  47. package/src/utils/config-store.ts +0 -46
  48. package/src/utils/config.ts +0 -65
  49. package/tsconfig.json +0 -22
@@ -0,0 +1,91 @@
1
+ // ../mcp/dist/mcp/src/shared/firestore-retry.js
2
+ var TRANSIENT_GRPC_CODES = /* @__PURE__ */ new Set([
3
+ 4,
4
+ // DEADLINE_EXCEEDED
5
+ 8,
6
+ // RESOURCE_EXHAUSTED
7
+ 10,
8
+ // ABORTED (transaction contention)
9
+ 13,
10
+ // INTERNAL
11
+ 14
12
+ // UNAVAILABLE
13
+ ]);
14
+ var TRANSIENT_MESSAGE_PATTERNS = [
15
+ "UNAVAILABLE",
16
+ "DEADLINE_EXCEEDED",
17
+ "ABORTED",
18
+ "INTERNAL",
19
+ "RESOURCE_EXHAUSTED",
20
+ "ECONNRESET",
21
+ "ETIMEDOUT",
22
+ "socket hang up",
23
+ "fetch failed",
24
+ "RST_STREAM",
25
+ "Connection reset"
26
+ ];
27
+ function isTransientFirestoreError(err) {
28
+ if (!err || typeof err !== "object")
29
+ return false;
30
+ const e = err;
31
+ if (typeof e.code === "number" && TRANSIENT_GRPC_CODES.has(e.code)) {
32
+ return true;
33
+ }
34
+ const msg = String(e.message ?? "");
35
+ return TRANSIENT_MESSAGE_PATTERNS.some((pat) => msg.includes(pat));
36
+ }
37
+ var DEFAULTS = {
38
+ maxRetries: 3,
39
+ baseDelayMs: 200,
40
+ jitter: true,
41
+ operationName: "firestore_write"
42
+ };
43
+ async function firestoreRetry(fn, options = {}) {
44
+ const opts = { ...DEFAULTS, ...options };
45
+ let lastErr;
46
+ for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
47
+ try {
48
+ return await fn();
49
+ } catch (err) {
50
+ lastErr = err;
51
+ if (!isTransientFirestoreError(err)) {
52
+ throw err;
53
+ }
54
+ if (attempt >= opts.maxRetries) {
55
+ auditLog("firestore_retry_exhausted", opts.operationName, {
56
+ attempts: attempt + 1,
57
+ error: String(err?.message ?? err).slice(0, 200)
58
+ });
59
+ throw err;
60
+ }
61
+ const baseDelay = opts.baseDelayMs * Math.pow(2, attempt);
62
+ const delay = opts.jitter ? baseDelay + Math.random() * baseDelay : baseDelay;
63
+ auditLog("firestore_retry", opts.operationName, {
64
+ attempt: attempt + 1,
65
+ operation: opts.operationName,
66
+ delay_ms: Math.round(delay),
67
+ error: String(err?.message ?? err).slice(0, 200)
68
+ });
69
+ await sleep(delay);
70
+ }
71
+ }
72
+ throw lastErr;
73
+ }
74
+ function sleep(ms) {
75
+ return new Promise((resolve) => setTimeout(resolve, ms));
76
+ }
77
+ function auditLog(eventType, operation, data) {
78
+ console.error(JSON.stringify({
79
+ audit: true,
80
+ severity: "WARNING",
81
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
82
+ eventType,
83
+ resourceType: "firestore",
84
+ resourceId: operation,
85
+ data
86
+ }));
87
+ }
88
+
89
+ export {
90
+ firestoreRetry
91
+ };
@@ -0,0 +1,46 @@
1
+ // ../mcp/dist/mcp/src/context-graph/score-history.js
2
+ import { getApps, getApp } from "firebase-admin/app";
3
+ import { getFirestore, Timestamp } from "firebase-admin/firestore";
4
+ function db() {
5
+ const app = getApps().length > 0 ? getApp() : void 0;
6
+ if (!app)
7
+ throw new Error("Firebase not initialized");
8
+ return getFirestore(app);
9
+ }
10
+ async function recordScoreSnapshot(productId, metrics, event, eventDetail) {
11
+ try {
12
+ const firestore = db();
13
+ const now = Timestamp.now();
14
+ const snapshot = {
15
+ engineering_readiness_pct: Math.round(metrics.engineering_readiness_pct ?? 0),
16
+ security_readiness_pct: Math.round(metrics.security_readiness_pct ?? 0),
17
+ reliability_readiness_pct: Math.round(metrics.reliability_readiness_pct ?? 0),
18
+ scalability_readiness_pct: Math.round(metrics.scalability_readiness_pct ?? 0),
19
+ nfr_coverage_pct: Math.round((metrics.nfr_coverage?.overall ?? 0) * 100),
20
+ speedup_factor: metrics.time_estimate?.speedup_factor ?? 1,
21
+ event,
22
+ ...eventDetail ? { event_detail: eventDetail } : {},
23
+ timestamp: now
24
+ };
25
+ const historyRef = firestore.collection("context_graph").doc(productId).collection("score_history").doc();
26
+ await historyRef.set(snapshot);
27
+ const jobRef = firestore.collection("premortem_jobs").doc(productId);
28
+ const jobSnap = await jobRef.get();
29
+ if (jobSnap.exists) {
30
+ const prefix = "result.decision.productionalization_feasibility";
31
+ await jobRef.update({
32
+ [`${prefix}.engineering_readiness_pct`]: snapshot.engineering_readiness_pct,
33
+ [`${prefix}.security_readiness_pct`]: snapshot.security_readiness_pct,
34
+ [`${prefix}.reliability_readiness_pct`]: snapshot.reliability_readiness_pct,
35
+ [`${prefix}.scalability_readiness_pct`]: snapshot.scalability_readiness_pct,
36
+ [`${prefix}.nfr_coverage_pct`]: snapshot.nfr_coverage_pct
37
+ });
38
+ }
39
+ } catch (err) {
40
+ console.error("[score-history] Failed to record snapshot:", err.message);
41
+ }
42
+ }
43
+
44
+ export {
45
+ recordScoreSnapshot
46
+ };