@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.
@@ -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-LI4AZPSJ.js";
78
+ } from "./chunk-6Y3AEXE3.js";
79
79
  import {
80
80
  GraphTraverser,
81
81
  computeGenericGraphMetrics,
82
82
  computeMetricsFromGraph,
83
83
  detectConstraintConflicts
84
- } from "./chunk-UBBAYTW3.js";
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-C7, D1-D8, E1-E4, F1-F3, G-*, H1-H3, I1-I8, J1-J6, K1-K8), values are "pass"|"fail"|"warn"|"not_applicable". This forces systematic coverage.
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}% |${isRescan ? deltaStr(row.current, row.previous) + " |" : ""}`);
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-DCNR7JZN.js");
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(", ")}**`);
@@ -78,7 +78,7 @@ import {
78
78
  upsertEdges,
79
79
  upsertEntities,
80
80
  upsertNodes
81
- } from "./chunk-LI4AZPSJ.js";
81
+ } from "./chunk-6Y3AEXE3.js";
82
82
  export {
83
83
  addEdges,
84
84
  addEntity,
@@ -14,7 +14,7 @@ import {
14
14
  requirePremiumWithAutoAuth,
15
15
  updateExplorationSession,
16
16
  validateRequestSize
17
- } from "./chunk-LI4AZPSJ.js";
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";
@@ -3,7 +3,7 @@ import {
3
3
  computeGenericGraphMetrics,
4
4
  computeGraphMetrics,
5
5
  computeMetricsFromGraph
6
- } from "./chunk-UBBAYTW3.js";
6
+ } from "./chunk-IDSVMCGM.js";
7
7
  export {
8
8
  applyGenericPrior,
9
9
  computeGenericGraphMetrics,
@@ -13,7 +13,7 @@ import {
13
13
  requirePremiumWithAutoAuth,
14
14
  validateAuth,
15
15
  validateRequestSize
16
- } from "./chunk-LI4AZPSJ.js";
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-LI4AZPSJ.js";
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";
@@ -27,7 +27,7 @@ import {
27
27
  updatePremortem,
28
28
  validateAuth,
29
29
  validateRequestSize
30
- } from "./chunk-LI4AZPSJ.js";
30
+ } from "./chunk-6Y3AEXE3.js";
31
31
 
32
32
  // ../mcp/dist/mcp/src/premortem-server.js
33
33
  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-LI4AZPSJ.js";
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibekiln/cutline-mcp-cli",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "CLI and MCP servers for Cutline — authenticate, then run constraint-aware MCP servers in Cursor or any MCP client.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",