@amirhosseinnateghi/vibed-mcp 0.1.7 → 0.1.8

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 (2) hide show
  1. package/dist/index.js +49 -20
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6009,6 +6009,25 @@ var CATEGORIES = [
6009
6009
  "Art",
6010
6010
  "Other"
6011
6011
  ];
6012
+ var TAGS = [
6013
+ "game",
6014
+ "puzzle",
6015
+ "quiz",
6016
+ "simulation",
6017
+ "music",
6018
+ "art",
6019
+ "animation",
6020
+ "story",
6021
+ "invitation",
6022
+ "love",
6023
+ "education",
6024
+ "science",
6025
+ "news",
6026
+ "tool",
6027
+ "productivity"
6028
+ ];
6029
+ var MAX_TAGS = 5;
6030
+ var FEED_TAG_CHIPS = ["All", ...TAGS];
6012
6031
  var VISIBILITY = ["public", "unlisted"];
6013
6032
  var COVER_MODES = ["image", "gif"];
6014
6033
  var EXPERIENCE_SOURCE = ["builder", "import", "remix"];
@@ -10285,15 +10304,22 @@ var categorySchema = external_exports.enum(CATEGORIES);
10285
10304
  var visibilitySchema = external_exports.enum(VISIBILITY);
10286
10305
  var coverModeSchema = external_exports.enum(COVER_MODES);
10287
10306
  var sourceSchema = external_exports.enum(EXPERIENCE_SOURCE);
10288
- var tagsSchema = external_exports.array(external_exports.string().min(1).max(40)).max(10).transform(
10307
+ var KNOWN_TAGS = new Set(TAGS);
10308
+ var tagsSchema = external_exports.array(external_exports.string().max(40)).transform(
10289
10309
  (tags) => Array.from(
10290
- new Set(tags.map((t) => t.replace(/^#/, "").trim().toLowerCase()).filter(Boolean))
10291
- )
10310
+ new Set(
10311
+ tags.map((t) => t.replace(/^#/, "").trim().toLowerCase()).filter((t) => KNOWN_TAGS.has(t))
10312
+ )
10313
+ ).slice(0, MAX_TAGS)
10292
10314
  ).default([]);
10293
10315
  var publishSchema = external_exports.object({
10294
10316
  title: external_exports.string().min(1).max(120),
10317
+ // Caption was removed from the publish UI; kept optional so old clients / the
10318
+ // CLI don't break and existing captions stay searchable.
10295
10319
  caption: external_exports.string().max(2e3).default(""),
10296
- category: categorySchema,
10320
+ // Legacy: category is no longer chosen in the UI. The connector CLI may still
10321
+ // send it; publishExperience folds it into `tags` and leaves the column null.
10322
+ category: categorySchema.optional(),
10297
10323
  tags: tagsSchema,
10298
10324
  remixable: external_exports.boolean().default(true),
10299
10325
  visibility: visibilitySchema.default("public"),
@@ -10406,7 +10432,8 @@ var aiConnectionSchema = external_exports.object({
10406
10432
  });
10407
10433
  var feedQuerySchema = external_exports.object({
10408
10434
  tab: external_exports.enum(["explore", "following"]).default("explore"),
10409
- category: external_exports.string().optional(),
10435
+ // Filter the explore feed to a single tag (replaces the old `category` param).
10436
+ tag: external_exports.string().optional(),
10410
10437
  cursor: external_exports.string().optional(),
10411
10438
  limit: external_exports.coerce.number().int().min(1).max(30).default(10)
10412
10439
  });
@@ -11435,10 +11462,14 @@ function inferTitle(html, projectDir) {
11435
11462
  const dir2 = basename(projectDir).replace(/[-_]+/g, " ").trim();
11436
11463
  return (dir2 || "Untitled").slice(0, 120);
11437
11464
  }
11438
- function normalizeCategory(input) {
11439
- if (!input) return "Other";
11440
- const match = CATEGORIES.find((c) => c.toLowerCase() === input.toLowerCase());
11441
- return match ?? "Other";
11465
+ function normalizeTags(tags, category) {
11466
+ const known = new Set(TAGS);
11467
+ const out = [];
11468
+ for (const t of [...tags ?? [], ...category ? [category] : []]) {
11469
+ const s = t.replace(/^#/, "").trim().toLowerCase();
11470
+ if (known.has(s) && !out.includes(s)) out.push(s);
11471
+ }
11472
+ return out.slice(0, MAX_TAGS);
11442
11473
  }
11443
11474
  async function importDraft(client, html) {
11444
11475
  const r = await apiFetch(client, "POST", "/imports", { html });
@@ -11447,9 +11478,7 @@ async function importDraft(client, html) {
11447
11478
  async function publishDraft(client, draftArtifactKey, meta, html, projectDir) {
11448
11479
  const exp = await apiFetch(client, "POST", "/experiences", {
11449
11480
  title: meta.title?.trim() || (html ? inferTitle(html, projectDir ?? ".") : "Untitled"),
11450
- caption: meta.caption ?? "",
11451
- category: normalizeCategory(meta.category),
11452
- tags: meta.tags ?? [],
11481
+ tags: normalizeTags(meta.tags, meta.category),
11453
11482
  remixable: meta.remixable ?? true,
11454
11483
  visibility: meta.visibility ?? "public",
11455
11484
  draftArtifactKey
@@ -11471,9 +11500,8 @@ async function deleteExperience(client, idOrUrl) {
11471
11500
  }
11472
11501
 
11473
11502
  // src/index.ts
11474
- var SERVER_INFO = { name: "vibed", version: "0.1.7" };
11503
+ var SERVER_INFO = { name: "vibed", version: "0.1.8" };
11475
11504
  var PROTOCOL_VERSION = "2024-11-05";
11476
- var CATEGORIES2 = ["Game", "Invitation", "Story", "News", "Quiz", "Tool", "Art", "Other"];
11477
11505
  var pendingLogin = null;
11478
11506
  var str = (v, d = "") => typeof v === "string" ? v : d;
11479
11507
  var bool = (v, d) => typeof v === "boolean" ? v : d;
@@ -11585,7 +11613,7 @@ Show it to the user. To publish it, call vibed_publish with draftKey: ${d.draftA
11585
11613
  },
11586
11614
  {
11587
11615
  name: "vibed_publish",
11588
- description: "Publish a vibed Experience. Pass draftKey (from vibed_draft) to promote an already-previewed draft \u2014 the recommended flow \u2014 or pass path to bundle + publish in one shot. Requires sign-in (vibed_whoami / vibed_login). Confirm the title and category with the user first \u2014 publishing is public. Returns the published URL, or the blockers if it isn't vibeable.",
11616
+ description: "Publish a vibed Experience. Pass draftKey (from vibed_draft) to promote an already-previewed draft \u2014 the recommended flow \u2014 or pass path to bundle + publish in one shot. Requires sign-in (vibed_whoami / vibed_login). Confirm the title and tags with the user first \u2014 publishing is public. Returns the published URL, or the blockers if it isn't vibeable.",
11589
11617
  inputSchema: {
11590
11618
  type: "object",
11591
11619
  properties: {
@@ -11595,9 +11623,12 @@ Show it to the user. To publish it, call vibed_publish with draftKey: ${d.draftA
11595
11623
  },
11596
11624
  path: { type: "string", description: "Project directory (default: current directory)" },
11597
11625
  title: { type: "string", description: "Title (default: page <title>/<h1>/folder name)" },
11598
- category: { type: "string", enum: CATEGORIES2, description: "Experience category" },
11599
- tags: { type: "array", items: { type: "string" } },
11600
- caption: { type: "string" },
11626
+ tags: {
11627
+ type: "array",
11628
+ items: { type: "string", enum: TAGS },
11629
+ maxItems: MAX_TAGS,
11630
+ description: `Up to ${MAX_TAGS} tags from: ${TAGS.join(", ")}`
11631
+ },
11601
11632
  unlisted: { type: "boolean", description: "Publish unlisted instead of public" },
11602
11633
  remixable: { type: "boolean", description: "Allow others to remix (default true)" },
11603
11634
  entry: { type: "string" },
@@ -11611,9 +11642,7 @@ Show it to the user. To publish it, call vibed_publish with draftKey: ${d.draftA
11611
11642
  const client = { apiBase: cfg.apiBase, token: cfg.token };
11612
11643
  const meta = {
11613
11644
  title: str(a.title) || void 0,
11614
- category: str(a.category) || void 0,
11615
11645
  tags: Array.isArray(a.tags) ? a.tags : void 0,
11616
- caption: str(a.caption) || void 0,
11617
11646
  remixable: bool(a.remixable, true),
11618
11647
  visibility: bool(a.unlisted, false) ? "unlisted" : "public"
11619
11648
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amirhosseinnateghi/vibed-mcp",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "vibed MCP server — make it vibed from any MCP client (Codex, Cursor, Gemini, …): check, login, and publish tools",
5
5
  "license": "MIT",
6
6
  "type": "module",