Developer docs
Manifest·

Manifest (PluginManifest)

The required fields of manifest.ts declared with defineManifest(), and zod validation.

manifest.ts is the plugin's SSOT (Single Source of Truth). You declare it with defineManifest(), which gives you type completion.

// src/manifest.ts
import { defineManifest } from "@niyase/plugin-sdk/manifest";

export const manifest = defineManifest({
  id: "@your-org/tasks",
  scope: "CERTIFIED",
  visibility: "PUBLIC",
  targetWorkspace: "BUSINESS",
  category: "extension",
  displayName: "タスク",
  description: "シンプルな業務タスク管理",
  iconName: "ListTodo",
  defaultRole: "PROVIDER",
  audiences: [
    {
      role: "executive",
      nav: {
        label: "タスク",
        href: "/plugin/tasks",
        activeColor: "text-primary",
      },
      tabs: [{ value: "list", label: "一覧" }],
    },
  ],
  tables: [
    {
      name: "task",
      columns: {
        title: { type: "TEXT", notNull: true },
        status: { type: "TEXT" },
      },
    },
  ],
  paletteMetadata: {
    intentTags: [
      "タスクを追加",
      "TODO 管理",
      "担当者を割り当て",
      "期限を設定",
      "進捗を確認",
    ],
    intentCategories: ["project"],
    capabilityKeywords: ["タスク管理", "TODO"],
    scenarios: ["朝の段取り", "週次レビュー"],
  },
});

Required fields

FieldTypeDescription
id@scope/nameGlobally unique ID. scope is your claimed namespace
scopeOFFICIAL | CERTIFIED | PRIVATEProvider category
visibilityPUBLIC | PRIVATEMarketplace visibility
targetWorkspaceBUSINESS | PERSONAL | BOTHTarget space type
categoryPluginSidebarCategorySidebar category
displayNamestringDisplay name in the UI
descriptionstringA 1–2 line description
iconNamestringA lucide-react icon name
defaultRolePROVIDER | CLIENT | LOCALDefault role on activation
audiencesPluginAudience[]Per-role (executive / employee / customer) nav and tabs
tablesPluginTableDef[]Your own table definitions (use [] if none)
paletteMetadataPluginPaletteMetadataFor unified-palette search (required, see below)

paletteMetadata (required)

Required because the unified palette is the primary path for discovering plugins.

  • intentTags: free text in concrete terms, 5–15 entries
  • intentCategories: top-level category enum, 1–3 entries
  • capabilityKeywords: capability words
  • scenarios: business scenarios

Optional fields

industries (recommended industry tags) / industryPresets (per-industry i18nTerms, seedData, conditionalTables) / tablePrefix / version / pairedPluginId / requiresCloud, and so on.

Validation

niyase-plugin lint validates the manifest with validateManifest() (zod). This is identical to the validator the server uses at submission time, so if lint passes, submission will pass too.

niyase-plugin lint
# ✓ tsc --noEmit
# ✓ manifest validation OK (@your-org/tasks)