@vibekiln/cutline-mcp-cli 0.2.0 → 0.4.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/dist/commands/setup.js +1 -1
- package/dist/index.js +1 -1
- package/dist/servers/{chunk-LI4AZPSJ.js → chunk-6Y3AEXE3.js} +1 -1
- package/dist/servers/{chunk-UBBAYTW3.js → chunk-IDSVMCGM.js} +4 -2
- package/dist/servers/cutline-server.js +155 -10
- package/dist/servers/{data-client-PYMN6TQ7.js → data-client-PPEF2XUI.js} +1 -1
- package/dist/servers/exploration-server.js +1 -1
- package/dist/servers/{graph-metrics-DCNR7JZN.js → graph-metrics-KLHCMDFT.js} +1 -1
- package/dist/servers/integrations-server.js +1 -1
- package/dist/servers/output-server.js +1 -1
- package/dist/servers/premortem-server.js +1 -1
- package/dist/servers/tools-server.js +1 -1
- package/package.json +1 -1
package/dist/commands/setup.js
CHANGED
|
@@ -27,7 +27,7 @@ const SERVER_NAMES = [
|
|
|
27
27
|
'output',
|
|
28
28
|
'integrations',
|
|
29
29
|
];
|
|
30
|
-
const AUDIT_DIMENSIONS = ['engineering', 'security', 'reliability', 'scalability'];
|
|
30
|
+
const AUDIT_DIMENSIONS = ['engineering', 'security', 'reliability', 'scalability', 'compliance'];
|
|
31
31
|
async function detectTier(options) {
|
|
32
32
|
const refreshToken = await getRefreshToken();
|
|
33
33
|
if (!refreshToken)
|
package/dist/index.js
CHANGED
|
@@ -55,7 +55,7 @@ program
|
|
|
55
55
|
.option('--skip-login', 'Skip authentication (use existing credentials)')
|
|
56
56
|
.option('--project-root <path>', 'Project root directory for IDE rules (default: cwd)')
|
|
57
57
|
.option('--hide-audit-dimension <name>', 'Hide one audit dimension in surfaced code audit output (repeatable)', (value, prev) => [...prev, value], [])
|
|
58
|
-
.option('--hide-audit-dimensions <csv>', 'Hide multiple audit dimensions (comma-separated: engineering,security,reliability,scalability)')
|
|
58
|
+
.option('--hide-audit-dimensions <csv>', 'Hide multiple audit dimensions (comma-separated: engineering,security,reliability,scalability,compliance)')
|
|
59
59
|
.action((opts) => setupCommand({
|
|
60
60
|
staging: opts.staging,
|
|
61
61
|
skipLogin: opts.skipLogin,
|
|
@@ -287,7 +287,7 @@ async function exchangeRefreshToken(refreshToken, firebaseApiKey, maxRetries = 3
|
|
|
287
287
|
}
|
|
288
288
|
throw lastError || new Error("Token exchange failed after retries");
|
|
289
289
|
}
|
|
290
|
-
var AUDIT_DIMENSIONS = ["engineering", "security", "reliability", "scalability"];
|
|
290
|
+
var AUDIT_DIMENSIONS = ["engineering", "security", "reliability", "scalability", "compliance"];
|
|
291
291
|
function readLocalCutlineConfig() {
|
|
292
292
|
try {
|
|
293
293
|
const configPath = path.join(os.homedir(), ".cutline-mcp", "config.json");
|
|
@@ -565,7 +565,8 @@ function computeGraphMetrics(entities, edges, constraints, bindings, conflicts,
|
|
|
565
565
|
gdpr: "GDPR/CCPA",
|
|
566
566
|
owasp: "OWASP LLM Top 10",
|
|
567
567
|
glba: "GLBA",
|
|
568
|
-
ferpa: "FERPA/COPPA"
|
|
568
|
+
ferpa: "FERPA/COPPA",
|
|
569
|
+
ios: "iOS App Store"
|
|
569
570
|
};
|
|
570
571
|
const detectedFrameworks = /* @__PURE__ */ new Set();
|
|
571
572
|
for (const c of constraints) {
|
|
@@ -879,7 +880,8 @@ function computeGenericGraphMetrics(entities, edges, constraints, bindings) {
|
|
|
879
880
|
gdpr: "GDPR/CCPA",
|
|
880
881
|
owasp: "OWASP LLM Top 10",
|
|
881
882
|
glba: "GLBA",
|
|
882
|
-
ferpa: "FERPA/COPPA"
|
|
883
|
+
ferpa: "FERPA/COPPA",
|
|
884
|
+
ios: "iOS App Store"
|
|
883
885
|
};
|
|
884
886
|
const detectedFrameworks = /* @__PURE__ */ new Set();
|
|
885
887
|
for (const c of constraints) {
|
|
@@ -75,13 +75,13 @@ import {
|
|
|
75
75
|
upsertEntities,
|
|
76
76
|
upsertNodes,
|
|
77
77
|
validateRequestSize
|
|
78
|
-
} from "./chunk-
|
|
78
|
+
} from "./chunk-6Y3AEXE3.js";
|
|
79
79
|
import {
|
|
80
80
|
GraphTraverser,
|
|
81
81
|
computeGenericGraphMetrics,
|
|
82
82
|
computeMetricsFromGraph,
|
|
83
83
|
detectConstraintConflicts
|
|
84
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-IDSVMCGM.js";
|
|
85
85
|
|
|
86
86
|
// ../mcp/dist/mcp/src/cutline-server.js
|
|
87
87
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -416,6 +416,21 @@ var PATH_PATTERNS = [
|
|
|
416
416
|
categories: ["compliance", "security"],
|
|
417
417
|
domain: "fedramp",
|
|
418
418
|
priority: "high"
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
patterns: [
|
|
422
|
+
/\/ios/i,
|
|
423
|
+
/\/swift/i,
|
|
424
|
+
/\/storekit/i,
|
|
425
|
+
/\/appstore/i,
|
|
426
|
+
/\/testflight/i,
|
|
427
|
+
/\.swift$/i,
|
|
428
|
+
/Info\.plist$/i
|
|
429
|
+
],
|
|
430
|
+
keywords: ["ios", "app-store", "storekit", "iap", "testflight", "swift", "mobile"],
|
|
431
|
+
categories: ["compliance", "security", "risk"],
|
|
432
|
+
domain: "ios_app_store",
|
|
433
|
+
priority: "high"
|
|
419
434
|
}
|
|
420
435
|
];
|
|
421
436
|
var CODE_PATTERNS = [
|
|
@@ -590,6 +605,20 @@ var CODE_PATTERNS = [
|
|
|
590
605
|
keywords: ["csa", "ccm", "cloud", "aws", "gcp", "azure", "cloud-security"],
|
|
591
606
|
categories: ["compliance", "security"],
|
|
592
607
|
domain: "csa_ccm"
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
patterns: [
|
|
611
|
+
/StoreKit/i,
|
|
612
|
+
/SKPaymentQueue/i,
|
|
613
|
+
/SKProductsRequest/i,
|
|
614
|
+
/ASAuthorizationAppleID/i,
|
|
615
|
+
/UIApplicationOpenSettingsURLString/i,
|
|
616
|
+
/ATTrackingManager/i,
|
|
617
|
+
/\.swift$/i
|
|
618
|
+
],
|
|
619
|
+
keywords: ["ios", "app-store", "storekit", "iap", "apple-signin", "tracking-consent"],
|
|
620
|
+
categories: ["compliance", "security"],
|
|
621
|
+
domain: "ios_app_store"
|
|
593
622
|
}
|
|
594
623
|
];
|
|
595
624
|
function analyzeFilePaths(paths) {
|
|
@@ -2978,7 +3007,8 @@ var FRAMEWORK_ID_PREFIXES = {
|
|
|
2978
3007
|
gdpr: "GDPR/CCPA",
|
|
2979
3008
|
owasp: "OWASP LLM Top 10",
|
|
2980
3009
|
glba: "GLBA",
|
|
2981
|
-
ferpa: "FERPA/COPPA"
|
|
3010
|
+
ferpa: "FERPA/COPPA",
|
|
3011
|
+
ios: "iOS App Store"
|
|
2982
3012
|
};
|
|
2983
3013
|
function resolveFramework(constraintId) {
|
|
2984
3014
|
if (!constraintId.startsWith("constraint:blueprint:"))
|
|
@@ -4335,6 +4365,39 @@ var UNIVERSAL_CONSTRAINTS = [
|
|
|
4335
4365
|
file_patterns: ["**/api/auth/**", "**/api/login*", "**/api/callback*", "**/api/checkout*", "**/middleware/**"],
|
|
4336
4366
|
framework: "baseline"
|
|
4337
4367
|
},
|
|
4368
|
+
{
|
|
4369
|
+
id_suffix: "sensitive_tokens_not_in_urls",
|
|
4370
|
+
category: "security",
|
|
4371
|
+
summary: "Auth/session/API tokens MUST NOT be passed in URL query parameters during redirects. Sensitive tokens in URLs leak via logs, browser history, and referrers.",
|
|
4372
|
+
keywords: ["token", "query-param", "callback", "returnUrl", "redirect", "referrer", "url-leakage"],
|
|
4373
|
+
severity: "critical",
|
|
4374
|
+
action: "Use Authorization headers or httpOnly cookies for token transport. Validate callback/return URLs against an allowlist and never append bearer/session tokens to redirected URLs.",
|
|
4375
|
+
checklist_ref: "D11",
|
|
4376
|
+
file_patterns: ["**/auth/**", "**/api/auth/**", "**/api/**/checkout*", "**/mcp-auth*", "**/session/**", "**/middleware/**"],
|
|
4377
|
+
framework: "baseline"
|
|
4378
|
+
},
|
|
4379
|
+
{
|
|
4380
|
+
id_suffix: "no_secrets_in_query_params",
|
|
4381
|
+
category: "security",
|
|
4382
|
+
summary: "Secrets (revalidation secrets, API secrets, webhook secrets) MUST NOT be transported via URL query parameters. Query-string secrets are leaked through logs, referrers, and browser history.",
|
|
4383
|
+
keywords: ["secret", "query-param", "url", "revalidate", "webhook", "referrer", "leakage"],
|
|
4384
|
+
severity: "critical",
|
|
4385
|
+
action: "Accept secrets only via headers or signed request bodies. Reject secret-bearing query params in production endpoints. Rotate any secret previously sent in URLs.",
|
|
4386
|
+
checklist_ref: "D12",
|
|
4387
|
+
file_patterns: ["**/api/**", "**/webhooks/**", "**/revalidate/**", "**/middleware/**"],
|
|
4388
|
+
framework: "baseline"
|
|
4389
|
+
},
|
|
4390
|
+
{
|
|
4391
|
+
id_suffix: "no_state_change_get_cookie_auth",
|
|
4392
|
+
category: "security",
|
|
4393
|
+
summary: "State-changing operations MUST NOT be reachable via GET when cookie authentication is accepted. GET + cookie auth creates CSRF risk.",
|
|
4394
|
+
keywords: ["csrf", "get", "state-change", "cookie-auth", "origin-check", "referer", "method-safety"],
|
|
4395
|
+
severity: "critical",
|
|
4396
|
+
action: "Use POST/PUT/DELETE for side effects. If GET fallback is unavoidable, enforce strict same-origin checks (Origin/Referer/sec-fetch-site) and avoid cookie-based auth fallback where possible.",
|
|
4397
|
+
checklist_ref: "D13",
|
|
4398
|
+
file_patterns: ["**/api/**", "**/auth/**", "**/checkout/**", "**/middleware/**"],
|
|
4399
|
+
framework: "baseline"
|
|
4400
|
+
},
|
|
4338
4401
|
{
|
|
4339
4402
|
id_suffix: "ai_cost_caps",
|
|
4340
4403
|
category: "security",
|
|
@@ -5406,6 +5469,53 @@ var BLUEPRINT_RULES = [
|
|
|
5406
5469
|
framework: "ferpa_coppa"
|
|
5407
5470
|
}
|
|
5408
5471
|
]
|
|
5472
|
+
},
|
|
5473
|
+
// ── iOS App Store Review Guidelines (mobile iOS apps) ──────────────────────
|
|
5474
|
+
{
|
|
5475
|
+
trigger: (eco, ctx) => {
|
|
5476
|
+
const iosSignals = /ios|swift|swiftui|xcode|uikit|storekit|appstore|testflight|cocoapods|xcframework/i;
|
|
5477
|
+
const hasLang = eco.languages.some((l) => /swift|objective-c|objc/i.test(l));
|
|
5478
|
+
const hasFramework = eco.frameworks.some((f) => iosSignals.test(f));
|
|
5479
|
+
const hasDep = eco.all_dependencies.some((d) => iosSignals.test(d));
|
|
5480
|
+
const descMatch = ctx?.productDescription ? /\b(ios|iphone|ipad|app\s*store|testflight|storekit|in-app purchase|apple sign in)\b/i.test(ctx.productDescription) : false;
|
|
5481
|
+
const entityMatch = ctx?.existingEntityNames?.some((n) => /\b(ios|mobile|iphone|ipad|app store|iap|storekit)\b/i.test(n)) ?? false;
|
|
5482
|
+
return hasLang || hasFramework || hasDep || descMatch || entityMatch;
|
|
5483
|
+
},
|
|
5484
|
+
constraints: [
|
|
5485
|
+
{
|
|
5486
|
+
id_suffix: "ios_app_store_privacy_disclosure",
|
|
5487
|
+
category: "compliance",
|
|
5488
|
+
summary: "[iOS App Store 5.1] Apps collecting user data MUST provide accurate privacy disclosures and clear in-app data handling flows.",
|
|
5489
|
+
keywords: ["ios", "app-store", "privacy", "disclosure", "tracking", "app-privacy"],
|
|
5490
|
+
severity: "critical",
|
|
5491
|
+
action: "Document data collection in App Privacy labels and align runtime behavior. Gate tracking behind explicit consent where required.",
|
|
5492
|
+
checklist_ref: "IOS-5.1",
|
|
5493
|
+
file_patterns: ["**/ios/**", "**/*.swift", "**/privacy*", "**/tracking/**", "**/analytics/**"],
|
|
5494
|
+
framework: "ios_app_store"
|
|
5495
|
+
},
|
|
5496
|
+
{
|
|
5497
|
+
id_suffix: "ios_app_store_iap_policy",
|
|
5498
|
+
category: "compliance",
|
|
5499
|
+
summary: "[iOS App Store 3.1] Digital goods/services sold in-app MUST use Apple's In-App Purchase flows where required.",
|
|
5500
|
+
keywords: ["ios", "app-store", "iap", "storekit", "payments", "digital-goods"],
|
|
5501
|
+
severity: "warning",
|
|
5502
|
+
action: "Use StoreKit for digital purchases in iOS app surfaces. Avoid bypass payment links that violate App Store rules.",
|
|
5503
|
+
checklist_ref: "IOS-3.1",
|
|
5504
|
+
file_patterns: ["**/ios/**", "**/*.swift", "**/billing/**", "**/payment/**", "**/storekit/**"],
|
|
5505
|
+
framework: "ios_app_store"
|
|
5506
|
+
},
|
|
5507
|
+
{
|
|
5508
|
+
id_suffix: "ios_app_store_account_deletion",
|
|
5509
|
+
category: "compliance",
|
|
5510
|
+
summary: "[iOS App Store 5.1.1(v)] If account creation exists, apps MUST provide in-app account deletion with data handling consistent with policy.",
|
|
5511
|
+
keywords: ["ios", "app-store", "account-deletion", "user-account", "privacy-rights"],
|
|
5512
|
+
severity: "warning",
|
|
5513
|
+
action: "Expose account deletion in-app for iOS users and ensure backend deletion flow is implemented and verifiable.",
|
|
5514
|
+
checklist_ref: "IOS-5.1.1",
|
|
5515
|
+
file_patterns: ["**/ios/**", "**/*.swift", "**/api/account*", "**/api/user*", "**/settings/**"],
|
|
5516
|
+
framework: "ios_app_store"
|
|
5517
|
+
}
|
|
5518
|
+
]
|
|
5409
5519
|
}
|
|
5410
5520
|
];
|
|
5411
5521
|
function buildBlueprintConstraints(ecosystem, context) {
|
|
@@ -5474,6 +5584,9 @@ D7. Do sensitive actions (account deletion, email change, role escalation) requi
|
|
|
5474
5584
|
D8. Is payment/billing logic validated server-side? Can prices or quantities be tampered with client-side?
|
|
5475
5585
|
D9. Are redirect URLs validated against an allowlist? Can open redirects be exploited for phishing?
|
|
5476
5586
|
D10. Are webhook signatures verified before processing payment or event data?
|
|
5587
|
+
D11. Are auth/session/API tokens kept out of URL query params (including callback/returnUrl redirects) and transported via headers or httpOnly cookies instead?
|
|
5588
|
+
D12. Are secrets (revalidate/API/webhook/etc.) kept out of URL query params and accepted only via headers or signed bodies?
|
|
5589
|
+
D13. Are side-effecting endpoints using non-GET methods, and are cookie-auth GET fallbacks protected with strict same-origin checks?
|
|
5477
5590
|
|
|
5478
5591
|
### E. Security Rules & Infrastructure
|
|
5479
5592
|
E1. For Firestore/database rules: do they enforce per-user data isolation?
|
|
@@ -5505,6 +5618,7 @@ Flag if the codebase contains signals that would require specific compliance fra
|
|
|
5505
5618
|
- **OWASP LLM**: OpenAI, Anthropic, LangChain, vector DBs (Pinecone, Weaviate), RAG pipelines, AI agents
|
|
5506
5619
|
- **GLBA**: Plaid, banking SDKs, KYC/AML, lending/mortgage/wealth management code
|
|
5507
5620
|
- **FERPA/COPPA**: EdTech integrations (Clever, Canvas), student/minor data, classroom/school references
|
|
5621
|
+
- **iOS App Store**: iOS/Swift codepaths, App Store/TestFlight distribution, StoreKit/IAP, mobile app privacy policies
|
|
5508
5622
|
|
|
5509
5623
|
For each detected signal, note:
|
|
5510
5624
|
- H1. Which framework(s) apply and why
|
|
@@ -5551,8 +5665,8 @@ Return a JSON object with exactly these fields:
|
|
|
5551
5665
|
- targetUsers (string): Who uses this product, from a security perspective.
|
|
5552
5666
|
- referenceClasses (string[]): Security frameworks or standards that apply (e.g., "OWASP Top 10 2021", "SOC 2 Type II").
|
|
5553
5667
|
- constraints (object?): Resource constraints \u2014 team, budget_usd, deadline_days, must_ship_scope.
|
|
5554
|
-
- checklist_summary (object): Keys are checklist IDs (A1-A8, B1-B6, C1-
|
|
5555
|
-
- compliance_signals (array of {framework: "pci_dss"|"hipaa"|"fedramp"|"gdpr_ccpa"|"owasp_llm"|"glba"|"ferpa_coppa"|"csa_ccm", signal: string, confidence: number}?): Detected compliance framework signals. Return [] if none.
|
|
5668
|
+
- checklist_summary (object): Keys are checklist IDs (A1-A8, B1-B6, C1-C8, D1-D13, E1-E7, F1-F4, G-*, H1-H3, I1-I8, J1-J6, K1-K8), values are "pass"|"fail"|"warn"|"not_applicable". This forces systematic coverage.
|
|
5669
|
+
- compliance_signals (array of {framework: "pci_dss"|"hipaa"|"fedramp"|"gdpr_ccpa"|"owasp_llm"|"glba"|"ferpa_coppa"|"csa_ccm"|"ios_app_store", signal: string, confidence: number}?): Detected compliance framework signals. Return [] if none.
|
|
5556
5670
|
|
|
5557
5671
|
Be concrete and specific. Reference file paths and line numbers where possible. If a checklist item cannot be assessed from the provided files, mark it "not_applicable" and note why. Cover ALL sections A through K.`;
|
|
5558
5672
|
var FULL_SYSTEM_PROMPT = `You are a product analyst reviewing a codebase. Given file contents, an ecosystem fingerprint, and existing constraints, extract structured product context.
|
|
@@ -5777,6 +5891,11 @@ var SECURITY_PATH_PATTERNS = [
|
|
|
5777
5891
|
/\/permissions?/i,
|
|
5778
5892
|
/\/roles?/i,
|
|
5779
5893
|
/\/tokens?/i,
|
|
5894
|
+
/\/redirect/i,
|
|
5895
|
+
/\/callback/i,
|
|
5896
|
+
/returnurl/i,
|
|
5897
|
+
/\/mcp-auth/i,
|
|
5898
|
+
/checkout-link/i,
|
|
5780
5899
|
/\/csrf/i,
|
|
5781
5900
|
/\/rate-limit/i,
|
|
5782
5901
|
/\/encrypt/i,
|
|
@@ -6157,13 +6276,15 @@ async function seedBlueprintConstraints(productId, ecosystem, deps, blueprintCon
|
|
|
6157
6276
|
const FRAMEWORK_LABELS = {
|
|
6158
6277
|
baseline: "Security Baseline",
|
|
6159
6278
|
soc2: "SOC 2",
|
|
6279
|
+
csa_ccm: "CSA Controls Matrix",
|
|
6160
6280
|
pci_dss: "PCI-DSS",
|
|
6161
6281
|
hipaa: "HIPAA",
|
|
6162
6282
|
fedramp: "FedRAMP",
|
|
6163
6283
|
gdpr_ccpa: "GDPR/CCPA",
|
|
6164
6284
|
owasp_llm: "OWASP LLM Top 10",
|
|
6165
6285
|
glba: "GLBA",
|
|
6166
|
-
ferpa_coppa: "FERPA/COPPA"
|
|
6286
|
+
ferpa_coppa: "FERPA/COPPA",
|
|
6287
|
+
ios_app_store: "iOS App Store"
|
|
6167
6288
|
};
|
|
6168
6289
|
const newEntities = [];
|
|
6169
6290
|
const newEdges = [];
|
|
@@ -6458,6 +6579,11 @@ var SECURITY_PATH_PATTERNS2 = [
|
|
|
6458
6579
|
/billing/i,
|
|
6459
6580
|
/stripe/i,
|
|
6460
6581
|
/webhook/i,
|
|
6582
|
+
/redirect/i,
|
|
6583
|
+
/callback/i,
|
|
6584
|
+
/returnurl/i,
|
|
6585
|
+
/mcp-auth/i,
|
|
6586
|
+
/checkout-link/i,
|
|
6461
6587
|
// Scalability & reliability patterns
|
|
6462
6588
|
/\/db\//i,
|
|
6463
6589
|
/queries?\//i,
|
|
@@ -6979,10 +7105,15 @@ function formatAuditOutput(result, reportId, publicSiteUrl = "https://thecutline
|
|
|
6979
7105
|
return "reliability";
|
|
6980
7106
|
if (["scalability", "performance"].includes(c))
|
|
6981
7107
|
return "scalability";
|
|
7108
|
+
if (["compliance"].includes(c))
|
|
7109
|
+
return "compliance";
|
|
6982
7110
|
if (["code_quality", "general"].includes(c))
|
|
6983
7111
|
return "engineering";
|
|
6984
7112
|
return "security";
|
|
6985
7113
|
};
|
|
7114
|
+
const hasComplianceFrameworks = result.frameworksLoaded.length > 0;
|
|
7115
|
+
const complianceCurrent = hasComplianceFrameworks ? Math.round((m.nfr_coverage?.compliance ?? 0) * 100) : void 0;
|
|
7116
|
+
const compliancePrevious = hasComplianceFrameworks ? Math.round((p?.nfr_coverage?.compliance ?? 0) * 100) : void 0;
|
|
6986
7117
|
const lines = [
|
|
6987
7118
|
`# Cutline Code Audit`,
|
|
6988
7119
|
``,
|
|
@@ -7016,12 +7147,19 @@ function formatAuditOutput(result, reportId, publicSiteUrl = "https://thecutline
|
|
|
7016
7147
|
label: "Scalability",
|
|
7017
7148
|
current: m.scalability_readiness_pct ?? 0,
|
|
7018
7149
|
previous: p?.scalability_readiness_pct
|
|
7150
|
+
},
|
|
7151
|
+
{
|
|
7152
|
+
key: "compliance",
|
|
7153
|
+
label: "Compliance",
|
|
7154
|
+
current: complianceCurrent,
|
|
7155
|
+
previous: compliancePrevious,
|
|
7156
|
+
na: !hasComplianceFrameworks
|
|
7019
7157
|
}
|
|
7020
7158
|
].filter((row) => !hiddenSet.has(row.key));
|
|
7021
7159
|
lines.push(``, `## Readiness Scores`, ``, `| Pillar | Score |${isRescan ? " Change |" : ""}`, `|--------|-------|${isRescan ? "--------|" : ""}`);
|
|
7022
7160
|
if (scoreRows.length > 0) {
|
|
7023
7161
|
for (const row of scoreRows) {
|
|
7024
|
-
lines.push(`| ${row.label} | ${row.current}
|
|
7162
|
+
lines.push(`| ${row.label} | ${row.na ? "N/A" : `${row.current ?? 0}%`} |${isRescan ? row.na ? " (n/a) |" : deltaStr(row.current, row.previous) + " |" : ""}`);
|
|
7025
7163
|
}
|
|
7026
7164
|
lines.push(``);
|
|
7027
7165
|
} else {
|
|
@@ -8279,6 +8417,8 @@ Why AI: ${idea.whyAI}`
|
|
|
8279
8417
|
return "reliability";
|
|
8280
8418
|
if (["scalability", "performance"].includes(c))
|
|
8281
8419
|
return "scalability";
|
|
8420
|
+
if (["compliance"].includes(c))
|
|
8421
|
+
return "compliance";
|
|
8282
8422
|
if (["code_quality", "general"].includes(c))
|
|
8283
8423
|
return "engineering";
|
|
8284
8424
|
return "security";
|
|
@@ -8332,6 +8472,9 @@ Why AI: ${idea.whyAI}`
|
|
|
8332
8472
|
if (!hiddenSet.has("scalability")) {
|
|
8333
8473
|
reportMetrics.scalability_readiness_pct = result.metrics.scalability_readiness_pct ?? 0;
|
|
8334
8474
|
}
|
|
8475
|
+
if (!hiddenSet.has("compliance")) {
|
|
8476
|
+
reportMetrics.compliance_readiness_pct = result.frameworksLoaded.length > 0 ? Math.round((result.metrics.nfr_coverage?.compliance ?? 0) * 100) : null;
|
|
8477
|
+
}
|
|
8335
8478
|
const visibleFindings = result.gatedGapDetails.filter((f) => !hiddenSet.has(inferFindingDimension(f.category)));
|
|
8336
8479
|
const saved = await saveScanReport({
|
|
8337
8480
|
metrics: reportMetrics,
|
|
@@ -9011,7 +9154,8 @@ Meta: ${JSON.stringify(output.meta)}` }
|
|
|
9011
9154
|
gdpr: "GDPR/CCPA",
|
|
9012
9155
|
owasp: "OWASP LLM Top 10",
|
|
9013
9156
|
glba: "GLBA",
|
|
9014
|
-
ferpa: "FERPA/COPPA"
|
|
9157
|
+
ferpa: "FERPA/COPPA",
|
|
9158
|
+
ios: "iOS App Store"
|
|
9015
9159
|
};
|
|
9016
9160
|
const formattedConstraints = topConstraints.map((c) => {
|
|
9017
9161
|
const framework = detectFramework2(c.id);
|
|
@@ -10001,7 +10145,7 @@ ${JSON.stringify(metrics, null, 2)}` }
|
|
|
10001
10145
|
getAllNodes(product_id),
|
|
10002
10146
|
getAllBindings(product_id)
|
|
10003
10147
|
]);
|
|
10004
|
-
const { computeMetricsFromGraph: computeMetricsFromGraph2 } = await import("./graph-metrics-
|
|
10148
|
+
const { computeMetricsFromGraph: computeMetricsFromGraph2 } = await import("./graph-metrics-KLHCMDFT.js");
|
|
10005
10149
|
const updatedMetrics = computeMetricsFromGraph2(rgrEntities, rgrEdges, rgrConstraints, rgrBindings, updatedPhases);
|
|
10006
10150
|
await updateGraphMetadata(product_id, {
|
|
10007
10151
|
...meta ?? {
|
|
@@ -10427,7 +10571,8 @@ Meta: ${JSON.stringify({
|
|
|
10427
10571
|
gdpr_ccpa: "GDPR/CCPA",
|
|
10428
10572
|
owasp_llm: "OWASP LLM Top 10",
|
|
10429
10573
|
glba: "GLBA",
|
|
10430
|
-
ferpa_coppa: "FERPA/COPPA"
|
|
10574
|
+
ferpa_coppa: "FERPA/COPPA",
|
|
10575
|
+
ios_app_store: "iOS App Store"
|
|
10431
10576
|
};
|
|
10432
10577
|
const names = result.frameworksLoaded.map((f) => fwLabels[f] || f);
|
|
10433
10578
|
sections.push(`- Compliance frameworks loaded: **${names.join(", ")}**`);
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
requirePremiumWithAutoAuth,
|
|
15
15
|
updateExplorationSession,
|
|
16
16
|
validateRequestSize
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-6Y3AEXE3.js";
|
|
18
18
|
|
|
19
19
|
// ../mcp/dist/mcp/src/exploration-server.js
|
|
20
20
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
requirePremiumWithAutoAuth,
|
|
14
14
|
validateAuth,
|
|
15
15
|
validateRequestSize
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-6Y3AEXE3.js";
|
|
17
17
|
|
|
18
18
|
// ../mcp/dist/mcp/src/integrations-server.js
|
|
19
19
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
mapErrorToMcp,
|
|
14
14
|
requirePremiumWithAutoAuth,
|
|
15
15
|
validateRequestSize
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-6Y3AEXE3.js";
|
|
17
17
|
|
|
18
18
|
// ../mcp/dist/mcp/src/output-server.js
|
|
19
19
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
requirePremiumWithAutoAuth,
|
|
22
22
|
validateAuth,
|
|
23
23
|
validateRequestSize
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-6Y3AEXE3.js";
|
|
25
25
|
|
|
26
26
|
// ../mcp/dist/mcp/src/tools-server.js
|
|
27
27
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
package/package.json
CHANGED