prpm 1.1.7 → 1.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.
package/dist/index.js CHANGED
@@ -3211,7 +3211,7 @@ function fromClaude(content, metadata, sourceFormat = "claude", explicitSubtype)
3211
3211
  }
3212
3212
  };
3213
3213
  sections.push(metadataSection);
3214
- const toolsField = frontmatter["allowed-tools"] || frontmatter.tools;
3214
+ const toolsField = frontmatter.tools || frontmatter["allowed-tools"];
3215
3215
  if (toolsField) {
3216
3216
  const tools = toolsField.split(",").map((t) => t.trim()).filter(Boolean);
3217
3217
  if (tools.length > 0) {
@@ -9382,7 +9382,11 @@ function loadSchema(format, subtype) {
9382
9382
  "claude:hook": "claude-hook.schema.json",
9383
9383
  "cursor:slash-command": "cursor-command.schema.json",
9384
9384
  "kiro:hook": "kiro-hooks.schema.json",
9385
- "kiro:agent": "kiro-agent.schema.json"
9385
+ "kiro:agent": "kiro-agent.schema.json",
9386
+ "droid:skill": "droid-skill.schema.json",
9387
+ "droid:slash-command": "droid-slash-command.schema.json",
9388
+ "droid:hook": "droid-hook.schema.json",
9389
+ "opencode:slash-command": "opencode-slash-command.schema.json"
9386
9390
  };
9387
9391
  schemaFilename = subtypeSchemaMap[cacheKey];
9388
9392
  }
@@ -9789,24 +9793,45 @@ function convertContent2(pkg, warnings, options, isSlashCommand = false) {
9789
9793
  const metadata = pkg.content.sections.find((s) => s.type === "metadata");
9790
9794
  const tools = pkg.content.sections.find((s) => s.type === "tools");
9791
9795
  const persona = pkg.content.sections.find((s) => s.type === "persona");
9796
+ lines.push("---");
9792
9797
  if (!isSlashCommand) {
9793
- lines.push("---");
9794
- lines.push(`name: ${pkg.name}`);
9798
+ lines.push(`name: ${pkg.id}`);
9795
9799
  if ((metadata == null ? void 0 : metadata.type) === "metadata") {
9796
9800
  lines.push(`description: ${metadata.data.description}`);
9797
9801
  }
9798
9802
  const toolsValue = ((_a = options == null ? void 0 : options.claudeConfig) == null ? void 0 : _a.tools) || ((tools == null ? void 0 : tools.type) === "tools" ? tools.tools.join(", ") : void 0);
9799
9803
  if (toolsValue) {
9800
- lines.push(`allowed-tools: ${toolsValue}`);
9804
+ lines.push(`tools: ${toolsValue}`);
9801
9805
  }
9802
9806
  const storedModel = (metadata == null ? void 0 : metadata.type) === "metadata" ? (_b = metadata.data.claudeAgent) == null ? void 0 : _b.model : void 0;
9803
9807
  const modelValue = ((_c = options == null ? void 0 : options.claudeConfig) == null ? void 0 : _c.model) || storedModel;
9804
9808
  if (modelValue) {
9805
9809
  lines.push(`model: ${modelValue}`);
9806
9810
  }
9807
- lines.push("---");
9808
- lines.push("");
9811
+ } else {
9812
+ const claudeSlashCommand = (metadata == null ? void 0 : metadata.type) === "metadata" ? metadata.data.claudeSlashCommand : void 0;
9813
+ if (claudeSlashCommand) {
9814
+ if (claudeSlashCommand.allowedTools) {
9815
+ lines.push(`allowed-tools: ${claudeSlashCommand.allowedTools}`);
9816
+ }
9817
+ if (claudeSlashCommand.argumentHint) {
9818
+ lines.push(`argument-hint: ${claudeSlashCommand.argumentHint}`);
9819
+ }
9820
+ if (claudeSlashCommand.description) {
9821
+ lines.push(`description: ${claudeSlashCommand.description}`);
9822
+ }
9823
+ if (claudeSlashCommand.model) {
9824
+ lines.push(`model: ${claudeSlashCommand.model}`);
9825
+ }
9826
+ if (claudeSlashCommand.disableModelInvocation !== void 0) {
9827
+ lines.push(`disable-model-invocation: ${claudeSlashCommand.disableModelInvocation}`);
9828
+ }
9829
+ } else if ((metadata == null ? void 0 : metadata.type) === "metadata" && metadata.data.description) {
9830
+ lines.push(`description: ${metadata.data.description}`);
9831
+ }
9809
9832
  }
9833
+ lines.push("---");
9834
+ lines.push("");
9810
9835
  if ((metadata == null ? void 0 : metadata.type) === "metadata") {
9811
9836
  const { title, icon } = metadata.data;
9812
9837
  if (icon) {
@@ -10282,9 +10307,10 @@ function toKiro(pkg, options = {}) {
10282
10307
  const warnings = [];
10283
10308
  let qualityScore = 100;
10284
10309
  try {
10285
- const config = options.kiroConfig;
10286
- if (!config || !config.inclusion) {
10287
- throw new Error("Kiro format requires inclusion mode (always|fileMatch|manual)");
10310
+ const config = options.kiroConfig || { inclusion: "always" };
10311
+ if (!config.inclusion) {
10312
+ config.inclusion = "always";
10313
+ warnings.push('No inclusion mode specified, defaulting to "always" per schema');
10288
10314
  }
10289
10315
  if (config.inclusion === "fileMatch" && !config.fileMatchPattern) {
10290
10316
  throw new Error("fileMatch inclusion mode requires fileMatchPattern");
@@ -10318,7 +10344,7 @@ ${content}`;
10318
10344
  }
10319
10345
  function generateFrontmatter2(config) {
10320
10346
  const lines = ["---"];
10321
- lines.push(`inclusion: ${config.inclusion}`);
10347
+ lines.push(`inclusion: ${config.inclusion || "always"}`);
10322
10348
  if (config.inclusion === "fileMatch" && config.fileMatchPattern) {
10323
10349
  lines.push(`fileMatchPattern: "${config.fileMatchPattern}"`);
10324
10350
  }
@@ -10783,16 +10809,7 @@ function toAgentsMd(pkg, options = {}) {
10783
10809
  let qualityScore = 100;
10784
10810
  try {
10785
10811
  const config = options.agentsMdConfig || {};
10786
- const content = convertContent5(pkg, warnings, config);
10787
- let fullContent;
10788
- if (config.includeFrontmatter && (config.project || config.scope)) {
10789
- const frontmatter = generateFrontmatter3(config);
10790
- fullContent = `${frontmatter}
10791
-
10792
- ${content}`;
10793
- } else {
10794
- fullContent = content;
10795
- }
10812
+ const fullContent = convertContent5(pkg, warnings, config);
10796
10813
  const lossyConversion = warnings.some((w) => w.includes("not supported") || w.includes("skipped"));
10797
10814
  if (lossyConversion) {
10798
10815
  qualityScore -= 10;
@@ -10815,17 +10832,6 @@ ${content}`;
10815
10832
  };
10816
10833
  }
10817
10834
  }
10818
- function generateFrontmatter3(config) {
10819
- const lines = ["---"];
10820
- if (config.project) {
10821
- lines.push(`project: ${config.project}`);
10822
- }
10823
- if (config.scope) {
10824
- lines.push(`scope: ${config.scope}`);
10825
- }
10826
- lines.push("---");
10827
- return lines.join("\n");
10828
- }
10829
10835
  function convertContent5(pkg, warnings, config) {
10830
10836
  var _a, _b, _c;
10831
10837
  const lines = [];
@@ -13882,6 +13888,9 @@ async function validatePackageFiles(manifest) {
13882
13888
  if (manifest.subtype === "skill") {
13883
13889
  return filePath.endsWith("SKILL.md");
13884
13890
  }
13891
+ if (manifest.subtype === "hook") {
13892
+ return false;
13893
+ }
13885
13894
  if (filePath.endsWith(".json")) {
13886
13895
  return false;
13887
13896
  }
@@ -14418,6 +14427,15 @@ ${"=".repeat(60)}`);
14418
14427
  }
14419
14428
  console.log(` Size: ${sizeDisplay}`);
14420
14429
  console.log("");
14430
+ let publishAsAuthor;
14431
+ if ((userInfo == null ? void 0 : userInfo.is_admin) && manifest.author) {
14432
+ publishAsAuthor = typeof manifest.author === "string" ? manifest.author : manifest.author.name;
14433
+ console.log(` \u{1F510} Admin override: Publishing as author "${publishAsAuthor}"`);
14434
+ }
14435
+ if (selectedOrgId) {
14436
+ console.log(` Publishing as organization: ${(_b = userInfo.organizations.find((org) => org.id === selectedOrgId)) == null ? void 0 : _b.name}`);
14437
+ console.log(` Organization ID: ${selectedOrgId}`);
14438
+ }
14421
14439
  if (options.dryRun) {
14422
14440
  console.log("\u2705 Dry run successful! Package is ready to publish.");
14423
14441
  publishedPackages.push({
@@ -14429,15 +14447,6 @@ ${"=".repeat(60)}`);
14429
14447
  break;
14430
14448
  }
14431
14449
  console.log("\u{1F680} Publishing to registry...");
14432
- let publishAsAuthor;
14433
- if ((userInfo == null ? void 0 : userInfo.is_admin) && manifest.author) {
14434
- publishAsAuthor = typeof manifest.author === "string" ? manifest.author : manifest.author.name;
14435
- console.log(` \u{1F510} Admin override: Publishing as author "${publishAsAuthor}"`);
14436
- }
14437
- if (selectedOrgId) {
14438
- console.log(` Publishing as organization: ${(_b = userInfo.organizations.find((org) => org.id === selectedOrgId)) == null ? void 0 : _b.name}`);
14439
- console.log(` Organization ID: ${selectedOrgId}`);
14440
- }
14441
14450
  const publishOptions = {};
14442
14451
  if (selectedOrgId) {
14443
14452
  publishOptions.orgId = selectedOrgId;
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/agents-md.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/agents-md.json",
4
+ "$comment": "Official documentation: https://docs.factory.ai/cli/configuration/agents-md",
4
5
  "title": "agents.md Format",
5
6
  "description": "JSON Schema for agents.md format - plain markdown project-specific AI instructions (NO frontmatter)",
6
7
  "type": "object",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/canonical.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/canonical.json",
4
4
  "title": "PRPM Canonical Package Format",
5
5
  "description": "Universal intermediate format for AI prompt packages that can be converted to any editor-specific format",
6
6
  "type": "object",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/claude-agent.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/claude/agent.json",
4
+ "$comment": "Official documentation: https://code.claude.com/docs/en/sub-agents",
4
5
  "title": "Claude Agent Format",
5
6
  "description": "JSON Schema for Claude Code Agents - long-running assistants with tool access",
6
7
  "type": "object",
@@ -14,26 +15,30 @@
14
15
  "type": "string",
15
16
  "pattern": "^[a-z0-9-]+$",
16
17
  "maxLength": 64,
17
- "description": "Agent identifier (lowercase letters, numbers, hyphens only)"
18
+ "description": "Unique identifier using lowercase letters and hyphens"
18
19
  },
19
20
  "description": {
20
21
  "type": "string",
21
22
  "maxLength": 1024,
22
- "description": "Brief overview of agent's functionality and use cases"
23
+ "description": "Natural language description of the subagent's purpose"
23
24
  },
24
- "allowed-tools": {
25
+ "tools": {
25
26
  "type": "string",
26
- "description": "Comma-separated list of available tools (e.g., 'Read, Write, Bash, WebSearch')"
27
+ "description": "Comma-separated list of specific tools. If omitted, inherits all tools from the main thread"
27
28
  },
28
29
  "model": {
29
30
  "type": "string",
30
31
  "enum": ["sonnet", "opus", "haiku", "inherit"],
31
- "description": "Claude model to use for this agent"
32
+ "description": "Model to use for this subagent. Can be a model alias (sonnet, opus, haiku) or 'inherit' to use the main conversation's model. If omitted, defaults to the configured subagent model"
32
33
  },
33
- "agentType": {
34
+ "permissionMode": {
34
35
  "type": "string",
35
- "const": "agent",
36
- "description": "Explicit marker for round-trip conversion"
36
+ "enum": ["default", "acceptEdits", "bypassPermissions", "plan", "ignore"],
37
+ "description": "Permission mode for the subagent. Controls how the subagent handles permission requests"
38
+ },
39
+ "skills": {
40
+ "type": "string",
41
+ "description": "Comma-separated list of skill names to auto-load when the subagent starts. Skills are loaded into the subagent's context automatically"
37
42
  }
38
43
  },
39
44
  "additionalProperties": false
@@ -48,7 +53,7 @@
48
53
  "frontmatter": {
49
54
  "name": "code-reviewer",
50
55
  "description": "Reviews code for best practices and potential issues",
51
- "allowed-tools": "Read, Grep, Bash",
56
+ "tools": "Read, Grep, Bash",
52
57
  "model": "sonnet"
53
58
  },
54
59
  "content": "# 🔍 Code Reviewer\n\nYou are an expert code reviewer with deep knowledge of software engineering principles.\n\n## Instructions\n\n- Check for code smells and anti-patterns\n- Verify test coverage"
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/claude-hook.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/claude/hook.json",
4
+ "$comment": "Official documentation: https://code.claude.com/docs/en/hooks",
4
5
  "title": "Claude Hook Format",
5
- "description": "JSON Schema for Claude Code Hooks - executable code triggered by events",
6
+ "description": "JSON Schema for Claude Code Hooks - executable code triggered by events. Valid hook events: PreToolUse (blocks the tool call, shows stderr to Claude), PermissionRequest (denies the permission, shows stderr to Claude), PostToolUse (shows stderr to Claude, tool already ran), Notification (shows stderr to user only), UserPromptSubmit (blocks prompt processing, erases prompt, shows stderr to user only), Stop (blocks stoppage, shows stderr to Claude), SubagentStop (blocks stoppage, shows stderr to Claude subagent), PreCompact (shows stderr to user only), SessionStart (shows stderr to user only), SessionEnd (shows stderr to user only)",
6
7
  "type": "object",
7
8
  "required": ["frontmatter", "content"],
8
9
  "properties": {
@@ -25,6 +26,7 @@
25
26
  "type": "string",
26
27
  "enum": [
27
28
  "PreToolUse",
29
+ "PermissionRequest",
28
30
  "PostToolUse",
29
31
  "UserPromptSubmit",
30
32
  "Notification",
@@ -34,7 +36,7 @@
34
36
  "SessionStart",
35
37
  "SessionEnd"
36
38
  ],
37
- "description": "Event that triggers this hook"
39
+ "description": "Event that triggers this hook. PreToolUse: blocks the tool call, shows stderr to Claude. PermissionRequest: denies the permission, shows stderr to Claude. PostToolUse: shows stderr to Claude (tool already ran). Notification: shows stderr to user only. UserPromptSubmit: blocks prompt processing, erases prompt, shows stderr to user only. Stop: blocks stoppage, shows stderr to Claude. SubagentStop: blocks stoppage, shows stderr to Claude subagent. PreCompact: shows stderr to user only. SessionStart: shows stderr to user only. SessionEnd: shows stderr to user only."
38
40
  },
39
41
  "language": {
40
42
  "type": "string",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/claude-skill.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/claude/skill.json",
4
+ "$comment": "Official documentation: https://code.claude.com/docs/en/skills",
4
5
  "title": "Claude Skill Format",
5
6
  "description": "JSON Schema for Claude Code Skills - reusable patterns invoked during conversation",
6
7
  "type": "object",
@@ -20,15 +21,6 @@
20
21
  "type": "string",
21
22
  "maxLength": 1024,
22
23
  "description": "Brief overview of functionality and when to use it"
23
- },
24
- "allowed-tools": {
25
- "type": "string",
26
- "description": "Comma-separated list of allowed tools (e.g., 'Read, Grep, Glob')"
27
- },
28
- "skillType": {
29
- "type": "string",
30
- "const": "skill",
31
- "description": "Explicit marker for round-trip conversion"
32
24
  }
33
25
  },
34
26
  "additionalProperties": false
@@ -42,8 +34,7 @@
42
34
  {
43
35
  "frontmatter": {
44
36
  "name": "refactor-helper",
45
- "description": "Assists with code refactoring while maintaining functionality",
46
- "allowed-tools": "Read, Edit, Grep"
37
+ "description": "Assists with code refactoring while maintaining functionality"
47
38
  },
48
39
  "content": "# Refactor Helper Skill\n\nHelps refactor code while maintaining functionality.\n\n## Guidelines\n\n- Preserve existing behavior\n- Improve code structure and readability"
49
40
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/claude-slash-command.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/claude/slash-command.json",
4
+ "$comment": "Official documentation: https://code.claude.com/docs/en/slash-commands",
4
5
  "title": "Claude Slash Command Format",
5
6
  "description": "JSON Schema for Claude Code Slash Commands - quick actions triggered by /command-name",
6
7
  "type": "object",
@@ -28,11 +29,6 @@
28
29
  "disable-model-invocation": {
29
30
  "type": "boolean",
30
31
  "description": "Whether to prevent SlashCommand tool from calling this command"
31
- },
32
- "commandType": {
33
- "type": "string",
34
- "const": "slash-command",
35
- "description": "Explicit marker for round-trip conversion (PRPM extension)"
36
32
  }
37
33
  },
38
34
  "additionalProperties": false
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/claude.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/claude.json",
4
+ "$comment": "Official documentation: https://code.claude.com/docs/en",
4
5
  "title": "Claude Code Format",
5
6
  "description": "JSON Schema for Claude Code agents, skills, and slash commands format",
6
7
  "type": "object",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/continue.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/continue.json",
4
+ "$comment": "Official documentation: https://docs.continue.dev/customize/deep-dives/rules",
4
5
  "title": "Continue Rules Format",
5
6
  "description": "JSON Schema for Continue rules format - markdown with optional YAML frontmatter or YAML configuration",
6
7
  "type": "object",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/copilot.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/copilot.json",
4
+ "$comment": "Official documentation: https://docs.github.com/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot",
4
5
  "title": "GitHub Copilot Instructions Format",
5
6
  "description": "JSON Schema for GitHub Copilot instructions (.github/copilot-instructions.md or .github/instructions/*.instructions.md)",
6
7
  "type": "object",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/cursor-command.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/cursor/command.json",
4
+ "$comment": "Official documentation: https://cursor.com/docs/agent/chat/commands#commands",
4
5
  "title": "Cursor Command Format",
5
6
  "description": "JSON Schema for Cursor commands (slash commands) - plain Markdown files in .cursor/commands/",
6
7
  "type": "object",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/cursor.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/cursor.json",
4
+ "$comment": "Official documentation: https://cursor.com/docs/context/rules",
4
5
  "title": "Cursor Rules Format",
5
6
  "description": "JSON Schema for Cursor .cursor/rules format with MDC (Markdown Components) frontmatter",
6
7
  "type": "object",
@@ -37,21 +38,6 @@
37
38
  "items": {
38
39
  "type": "string"
39
40
  }
40
- },
41
- "agentType": {
42
- "type": "string",
43
- "enum": ["agent"],
44
- "description": "Marks as agent subtype (PRPM extension for round-trip conversion)"
45
- },
46
- "skillType": {
47
- "type": "string",
48
- "enum": ["skill"],
49
- "description": "Marks as skill subtype (PRPM extension for round-trip conversion)"
50
- },
51
- "commandType": {
52
- "type": "string",
53
- "enum": ["slash-command"],
54
- "description": "Marks as slash command subtype (PRPM extension for round-trip conversion)"
55
41
  }
56
42
  },
57
43
  "additionalProperties": false
@@ -0,0 +1,103 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/droid/hook.json",
4
+ "$comment": "Official documentation: https://docs.factory.ai/cli/configuration/hooks",
5
+ "title": "Factory Droid Hook Format",
6
+ "description": "JSON Schema for Factory Droid Hooks - defined in settings.json files. Valid hook events: PreToolUse (runs before tool calls, can block them), PostToolUse (runs after tool calls complete), UserPromptSubmit (runs when user submits a prompt, before Droid processes it), Notification (runs when Droid sends notifications), Stop (runs when Droid finishes responding), SubagentStop (runs when sub-droid tasks complete), PreCompact (runs before Droid runs a compact operation), SessionStart (runs when Droid starts a new session or resumes an existing session), SessionEnd (runs when Droid session ends)",
7
+ "type": "object",
8
+ "required": ["hooks"],
9
+ "properties": {
10
+ "hooks": {
11
+ "type": "object",
12
+ "description": "Hook configurations organized by event type. Each key must be a valid hook event name.",
13
+ "patternProperties": {
14
+ "^(PreToolUse|PostToolUse|Notification|UserPromptSubmit|Stop|SubagentStop|PreCompact|SessionStart|SessionEnd)$": {
15
+ "type": "array",
16
+ "description": "Array of hook configurations for this event. PreToolUse: runs before tool calls (can block them). PostToolUse: runs after tool calls complete. UserPromptSubmit: runs when user submits a prompt, before Droid processes it. Notification: runs when Droid sends notifications. Stop: runs when Droid finishes responding. SubagentStop: runs when sub-droid tasks complete. PreCompact: runs before Droid runs a compact operation. SessionStart: runs when Droid starts a new session or resumes an existing session. SessionEnd: runs when Droid session ends.",
17
+ "items": {
18
+ "type": "object",
19
+ "required": ["hooks"],
20
+ "properties": {
21
+ "matcher": {
22
+ "type": "string",
23
+ "description": "Pattern for tool names. Supports exact strings, regex, or '*' for all tools. Optional for most events."
24
+ },
25
+ "hooks": {
26
+ "type": "array",
27
+ "description": "Array of commands to execute",
28
+ "minItems": 1,
29
+ "items": {
30
+ "type": "object",
31
+ "required": ["type", "command"],
32
+ "properties": {
33
+ "type": {
34
+ "type": "string",
35
+ "enum": ["command"],
36
+ "description": "Hook type (currently only 'command' is supported)"
37
+ },
38
+ "command": {
39
+ "type": "string",
40
+ "description": "Bash command to run. Supports $FACTORY_PROJECT_DIR variable."
41
+ },
42
+ "timeout": {
43
+ "type": "number",
44
+ "description": "Execution limit in seconds (defaults to 60)",
45
+ "default": 60,
46
+ "minimum": 1
47
+ }
48
+ }
49
+ }
50
+ },
51
+ "description": {
52
+ "type": "string",
53
+ "description": "Optional description for plugin hooks"
54
+ }
55
+ }
56
+ }
57
+ }
58
+ },
59
+ "additionalProperties": false
60
+ }
61
+ },
62
+ "examples": [
63
+ {
64
+ "hooks": {
65
+ "PreToolUse": [
66
+ {
67
+ "matcher": "write",
68
+ "hooks": [
69
+ {
70
+ "type": "command",
71
+ "command": "prettier --write \"$FACTORY_PROJECT_DIR/src/**/*.ts\"",
72
+ "timeout": 30
73
+ }
74
+ ]
75
+ }
76
+ ],
77
+ "PostToolUse": [
78
+ {
79
+ "matcher": "*",
80
+ "hooks": [
81
+ {
82
+ "type": "command",
83
+ "command": "git add .",
84
+ "timeout": 60
85
+ }
86
+ ]
87
+ }
88
+ ],
89
+ "SessionStart": [
90
+ {
91
+ "matcher": "startup",
92
+ "hooks": [
93
+ {
94
+ "type": "command",
95
+ "command": "echo 'Session started at $(date)' >> $FACTORY_PROJECT_DIR/.factory/session.log"
96
+ }
97
+ ]
98
+ }
99
+ ]
100
+ }
101
+ }
102
+ ]
103
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/droid/skill.json",
4
+ "$comment": "Official documentation: https://docs.factory.ai/cli/configuration/skills",
5
+ "title": "Factory Droid Skill Format",
6
+ "description": "JSON Schema for Factory Droid Skills - SKILL.md files stored in .factory/skills/<skill-name>/",
7
+ "type": "object",
8
+ "required": ["frontmatter", "content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "required": ["name", "description"],
13
+ "properties": {
14
+ "name": {
15
+ "type": "string",
16
+ "description": "Unique identifier for the skill (kebab-case recommended)"
17
+ },
18
+ "description": {
19
+ "type": "string",
20
+ "description": "Brief explanation of what the skill does and when to use it"
21
+ },
22
+ "allowed-tools": {
23
+ "type": "array",
24
+ "description": "Reserved for future use. Safe to omit.",
25
+ "items": {
26
+ "type": "string"
27
+ }
28
+ }
29
+ },
30
+ "additionalProperties": true
31
+ },
32
+ "content": {
33
+ "type": "string",
34
+ "description": "Skill workflow and instructions as markdown"
35
+ }
36
+ },
37
+ "examples": [
38
+ {
39
+ "frontmatter": {
40
+ "name": "api-integration",
41
+ "description": "Integrate a new API endpoint with proper error handling"
42
+ },
43
+ "content": "# API Integration Skill\n\n## Steps\n\n1. Define the API endpoint specification\n2. Create the service layer function\n3. Add error handling and validation\n4. Write unit tests\n5. Update API documentation\n\n## Success Criteria\n\n- All tests pass\n- Error handling covers edge cases\n- Documentation is updated"
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/droid/slash-command.json",
4
+ "$comment": "Official documentation: https://docs.factory.ai/cli/configuration/custom-slash-commands",
5
+ "title": "Factory Droid Slash Command Format",
6
+ "description": "JSON Schema for Factory Droid Slash Commands - markdown files stored in .factory/commands/",
7
+ "type": "object",
8
+ "required": ["frontmatter", "content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "properties": {
13
+ "description": {
14
+ "type": "string",
15
+ "description": "Overrides the generated summary shown in slash suggestions"
16
+ },
17
+ "argument-hint": {
18
+ "type": "string",
19
+ "description": "Appends inline usage hints (e.g., /code-review <branch-name>)"
20
+ },
21
+ "allowed-tools": {
22
+ "type": "array",
23
+ "description": "Reserved for future use. Safe to omit.",
24
+ "items": {
25
+ "type": "string"
26
+ }
27
+ }
28
+ },
29
+ "additionalProperties": true
30
+ },
31
+ "content": {
32
+ "type": "string",
33
+ "description": "Command instructions and workflow as markdown"
34
+ }
35
+ },
36
+ "examples": [
37
+ {
38
+ "frontmatter": {
39
+ "description": "Review code for a specific branch",
40
+ "argument-hint": "<branch-name>"
41
+ },
42
+ "content": "# Code Review Command\n\nReview the code changes in the specified branch.\n\n## Instructions\n\n1. Compare branch with main\n2. Check for code quality issues\n3. Suggest improvements"
43
+ },
44
+ {
45
+ "frontmatter": {
46
+ "description": "Run tests for a specific file",
47
+ "argument-hint": "<file-path>",
48
+ "allowed-tools": ["bash", "read"]
49
+ },
50
+ "content": "Run tests for the specified file and report results."
51
+ }
52
+ ]
53
+ }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/droid.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/droid.json",
4
+ "$comment": "Official documentation: https://docs.factory.ai/cli/configuration",
4
5
  "title": "Factory Droid Format",
5
6
  "description": "JSON Schema for Factory Droid Skills, Hooks, and Slash Commands",
6
7
  "type": "object",
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/gemini-md.json",
4
+ "$comment": "Official documentation: https://geminicli.com/docs/cli/gemini-md/#_top",
5
+ "title": "GEMINI.md Format",
6
+ "description": "JSON Schema for GEMINI.md format - plain markdown project-specific AI instructions (NO frontmatter)",
7
+ "type": "object",
8
+ "required": ["content"],
9
+ "properties": {
10
+ "content": {
11
+ "type": "string",
12
+ "description": "Plain markdown content with project-specific instructions, persona definitions, coding style guides, and best practices. No frontmatter allowed. Supports @file.md syntax for importing other files."
13
+ }
14
+ },
15
+ "additionalProperties": false,
16
+ "examples": [
17
+ {
18
+ "content": "# General Instructions\n\nYou are a helpful coding assistant.\n\n## Coding Style\n\n- Use TypeScript strict mode\n- Follow functional programming patterns\n- Write comprehensive tests"
19
+ },
20
+ {
21
+ "content": "# Project Context\n\nThis is a Next.js application with TypeScript.\n\n## Architecture\n\n- App Router (not Pages Router)\n- Server Components by default\n- Client Components only when needed\n\n## Database\n\nPostgreSQL with Prisma ORM"
22
+ }
23
+ ]
24
+ }
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/gemini.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/gemini.json",
4
+ "$comment": "Official documentation: https://geminicli.com/docs/cli/custom-commands/",
4
5
  "title": "Gemini Custom Commands Format",
5
- "description": "JSON Schema for Gemini CLI custom commands (.toml format)",
6
+ "description": "JSON Schema for Gemini CLI custom commands - TOML files stored in .gemini/commands/",
6
7
  "type": "object",
7
8
  "required": ["prompt"],
8
9
  "properties": {
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/kiro-agent.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/kiro/agent.json",
4
+ "$comment": "Official documentation: https://kiro.dev/docs/cli/custom-agents/",
4
5
  "title": "Kiro Agent Configuration Format",
5
6
  "description": "JSON Schema for Kiro custom agent configurations (.kiro/agents/*.json) - specialized AI assistants with specific tools and context",
6
7
  "type": "object",
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/kiro-hooks.schema.json",
4
- "title": "Kiro Hooks Format",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/kiro/hook.json",
4
+ "$comment": "Official documentation: https://kiro.dev/docs/hooks/",
5
+ "title": "Kiro Hook Format",
5
6
  "description": "JSON Schema for Kiro hook configuration files (.kiro/hooks/*.json) - event-driven automations",
6
7
  "type": "object",
7
8
  "required": ["name", "description", "version", "when", "then"],
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/kiro-steering.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/kiro-steering.json",
4
+ "$comment": "Official documentation: https://kiro.dev/docs/steering/",
4
5
  "title": "Kiro Steering Files Format",
5
6
  "description": "JSON Schema for Kiro steering files (.kiro/steering/*.md) - context-aware instructions with optional frontmatter (defaults to 'always' inclusion)",
6
7
  "type": "object",
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/opencode/slash-command.json",
4
+ "$comment": "Official documentation: https://opencode.ai/docs/slash-commands/",
5
+ "title": "OpenCode Slash Command Format",
6
+ "description": "JSON Schema for OpenCode Slash Commands - markdown files with YAML frontmatter stored in .opencode/command/",
7
+ "type": "object",
8
+ "required": ["frontmatter", "content"],
9
+ "properties": {
10
+ "frontmatter": {
11
+ "type": "object",
12
+ "required": ["template"],
13
+ "properties": {
14
+ "description": {
15
+ "type": "string",
16
+ "description": "Brief description of what the command does (shown in TUI)"
17
+ },
18
+ "template": {
19
+ "type": "string",
20
+ "description": "The prompt text sent to the LLM when executed. Required field. Supports placeholders: $ARGUMENTS, $1-$9, !`command`, @filename"
21
+ },
22
+ "agent": {
23
+ "type": "string",
24
+ "description": "Specifies which agent executes the command"
25
+ },
26
+ "model": {
27
+ "type": "string",
28
+ "description": "Overrides default model for this command (e.g., 'anthropic/claude-sonnet-4-20250514')"
29
+ },
30
+ "subtask": {
31
+ "type": "boolean",
32
+ "description": "Forces subagent invocation behavior when true"
33
+ }
34
+ },
35
+ "additionalProperties": true
36
+ },
37
+ "content": {
38
+ "type": "string",
39
+ "description": "Additional command documentation or notes (optional)"
40
+ }
41
+ },
42
+ "examples": [
43
+ {
44
+ "frontmatter": {
45
+ "description": "Run tests for a specific file",
46
+ "template": "Run the tests for $1 and report the results",
47
+ "agent": "test-runner",
48
+ "subtask": true
49
+ },
50
+ "content": "# Test Runner Command\n\nExecutes tests for the specified file and provides a detailed report."
51
+ },
52
+ {
53
+ "frontmatter": {
54
+ "template": "Review the following code for best practices:\n\n@$1",
55
+ "model": "anthropic/claude-sonnet-4-20250514"
56
+ },
57
+ "content": ""
58
+ }
59
+ ]
60
+ }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/opencode.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/opencode.json",
4
+ "$comment": "Official documentation: https://opencode.ai/docs/agents/",
4
5
  "title": "OpenCode Agent Format",
5
6
  "description": "JSON Schema for OpenCode Agents - markdown files with YAML frontmatter stored in .opencode/agent/",
6
7
  "type": "object",
@@ -8,30 +9,35 @@
8
9
  "properties": {
9
10
  "frontmatter": {
10
11
  "type": "object",
11
- "required": ["description"],
12
+ "required": ["description", "mode"],
12
13
  "properties": {
13
14
  "description": {
14
15
  "type": "string",
15
- "description": "Brief description of the agent's purpose (required)"
16
+ "description": "Brief explanation of the agent's purpose and use cases (required)"
16
17
  },
17
18
  "mode": {
18
19
  "type": "string",
19
20
  "enum": ["subagent", "primary", "all"],
20
- "description": "Determines usage context - subagent (spawned), primary (main), or all (both)"
21
+ "description": "Determines how the agent can be used: 'primary' (main assistant), 'subagent' (spawned by primary), or 'all' (both contexts). Required field.",
22
+ "default": "all"
21
23
  },
22
24
  "model": {
23
25
  "type": "string",
24
- "description": "Override default LLM (e.g., 'anthropic/claude-sonnet-4-20250514')"
26
+ "description": "Override default model (e.g., 'anthropic/claude-sonnet-4-20250514')"
25
27
  },
26
28
  "temperature": {
27
29
  "type": "number",
28
30
  "minimum": 0.0,
29
31
  "maximum": 1.0,
30
- "description": "Control response creativity (0.0-1.0 range)"
32
+ "description": "Controls response randomness (0.0-1.0). Defaults to model-specific values (typically 0, or 0.55 for Qwen models)"
33
+ },
34
+ "prompt": {
35
+ "type": "string",
36
+ "description": "Path to custom system prompt file using {file:./path} syntax"
31
37
  },
32
38
  "tools": {
33
39
  "type": "object",
34
- "description": "Enable/disable specific tool access",
40
+ "description": "Enable/disable specific tools. Supports wildcards (e.g., 'mymcp_*')",
35
41
  "properties": {
36
42
  "write": { "type": "boolean" },
37
43
  "edit": { "type": "boolean" },
@@ -46,7 +52,7 @@
46
52
  },
47
53
  "permission": {
48
54
  "type": "object",
49
- "description": "Granular control over tool usage (ask/allow/deny)",
55
+ "description": "Manages tool access with values: 'ask', 'allow', or 'deny'",
50
56
  "properties": {
51
57
  "edit": {
52
58
  "type": "string",
@@ -72,10 +78,10 @@
72
78
  },
73
79
  "disable": {
74
80
  "type": "boolean",
75
- "description": "Boolean to deactivate the agent"
81
+ "description": "When true, disables the agent"
76
82
  }
77
83
  },
78
- "additionalProperties": false
84
+ "additionalProperties": true
79
85
  },
80
86
  "content": {
81
87
  "type": "string",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/ruler.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/ruler.json",
4
+ "$comment": "Official documentation: https://okigu.com/ruler",
4
5
  "title": "Ruler Rules Format",
5
6
  "description": "JSON Schema for Ruler .ruler/ format - plain markdown without frontmatter, used for AI coding assistant instructions",
6
7
  "type": "object",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://prpm.dev/schemas/windsurf.schema.json",
3
+ "$id": "https://registry.prpm.dev/api/v1/schemas/windsurf.json",
4
+ "$comment": "Official documentation: https://docs.windsurf.com/windsurf/cascade/memories#rules",
4
5
  "title": "Windsurf Rules Format",
5
6
  "description": "JSON Schema for Windsurf .windsurf/rules format - plain markdown without frontmatter",
6
7
  "type": "object",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prpm",
3
- "version": "1.1.7",
3
+ "version": "1.1.8",
4
4
  "description": "Prompt Package Manager CLI - Install and manage prompt-based files",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -45,9 +45,9 @@
45
45
  "license": "MIT",
46
46
  "dependencies": {
47
47
  "@octokit/rest": "^22.0.0",
48
- "@pr-pm/converters": "^1.1.7",
49
- "@pr-pm/registry-client": "^2.1.7",
50
- "@pr-pm/types": "^1.1.7",
48
+ "@pr-pm/converters": "^1.1.8",
49
+ "@pr-pm/registry-client": "^2.1.8",
50
+ "@pr-pm/types": "^1.1.8",
51
51
  "ajv": "^8.17.1",
52
52
  "ajv-formats": "^3.0.1",
53
53
  "commander": "^11.1.0",