@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.
- package/Dockerfile +11 -0
- package/README.md +177 -107
- package/dist/auth/callback.js +30 -32
- package/dist/auth/keychain.js +7 -15
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +246 -0
- package/dist/commands/login.js +39 -45
- package/dist/commands/logout.js +13 -19
- package/dist/commands/serve.d.ts +1 -0
- package/dist/commands/serve.js +38 -0
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +255 -0
- package/dist/commands/status.js +29 -35
- package/dist/commands/upgrade.js +44 -38
- package/dist/index.js +38 -14
- package/dist/servers/chunk-7FHM2GD3.js +5836 -0
- package/dist/servers/chunk-IVWF7VYZ.js +10086 -0
- package/dist/servers/chunk-JBJYSV4P.js +139 -0
- package/dist/servers/chunk-KMUSQOTJ.js +47 -0
- package/dist/servers/chunk-PD2HN2R5.js +908 -0
- package/dist/servers/chunk-PU7TL6S3.js +91 -0
- package/dist/servers/chunk-TGSEURMN.js +46 -0
- package/dist/servers/chunk-UBBAYTW3.js +946 -0
- package/dist/servers/cutline-server.js +11512 -0
- package/dist/servers/exploration-server.js +1030 -0
- package/dist/servers/graph-metrics-DCNR7JZN.js +12 -0
- package/dist/servers/integrations-server.js +121 -0
- package/dist/servers/output-server.js +120 -0
- package/dist/servers/pipeline-O5GJPNR4.js +20 -0
- package/dist/servers/premortem-handoff-XT4K3YDJ.js +10 -0
- package/dist/servers/premortem-server.js +958 -0
- package/dist/servers/score-history-HO5KRVGC.js +6 -0
- package/dist/servers/tools-server.js +291 -0
- package/dist/utils/config-store.js +13 -21
- package/dist/utils/config.js +2 -6
- package/mcpb/manifest.json +77 -0
- package/package.json +55 -9
- package/server.json +42 -0
- package/smithery.yaml +10 -0
- package/src/auth/callback.ts +0 -102
- package/src/auth/keychain.ts +0 -16
- package/src/commands/login.ts +0 -202
- package/src/commands/logout.ts +0 -30
- package/src/commands/status.ts +0 -153
- package/src/commands/upgrade.ts +0 -121
- package/src/index.ts +0 -40
- package/src/utils/config-store.ts +0 -46
- package/src/utils/config.ts +0 -65
- 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
|
+
};
|