@modootoday/pmcp 0.16.0 → 0.17.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.
@@ -144,6 +144,8 @@ var MailboxError = class extends Error {
144
144
  this.retryable = retryable;
145
145
  this.name = "MailboxError";
146
146
  }
147
+ code;
148
+ retryable;
147
149
  };
148
150
  function failure(error) {
149
151
  if (error instanceof MailboxError) {
@@ -1089,6 +1091,7 @@ var NotificationOutbox = class {
1089
1091
  constructor(store) {
1090
1092
  this.store = store;
1091
1093
  }
1094
+ store;
1092
1095
  discover(binding, nativeTarget) {
1093
1096
  return this.store.run(() => {
1094
1097
  this.store.assertBinding(binding);
@@ -144,8 +144,7 @@ interface IntentCache {
144
144
  close(): void;
145
145
  }
146
146
  /**
147
- * Same question, differently typed. Case, punctuation and spacing only — the
148
- * key has to survive a caller writing "How do I wire X?" and "how do i wire x".
147
+ * Canonically equivalent Unicode must share the same query and cache key.
149
148
  */
150
149
  declare function normaliseIntent(intent: string): string;
151
150
 
@@ -541,4 +540,4 @@ declare function createSkillTools(options: SkillServerOptions): {
541
540
  };
542
541
  type SkillTools = ReturnType<typeof createSkillTools>;
543
542
 
544
- export { lexicalScore as $, ASSET_KINDS as A, type BundleFile as B, type CatalogOptions as C, DEFAULT_FIND_LIMIT as D, type Embedder as E, type FileKind as F, type SkillFileListing as G, type SkillFilters as H, type IntentCache as I, bundleResponseSchema as J, type KindFilter as K, bundleSkill as L, type MetadataValue as M, NAME_MAX as N, catalogResponseSchema as O, classify as P, cosine as Q, type Ranking as R, type SkillServerOptions as S, createSkillTools as T, describeResponseSchema as U, detectRuntime as V, displayPath as W, find as X, findResultSchema as Y, isUtf8Text as Z, kindOf as _, type SkillEntry as a, listSkillFiles as a0, mimeOf as a1, normaliseIntent as a2, frontmatterObject as a3, readBody as a4, readCatalog as a5, readFrontmatter as a6, readSkillFile as a7, runtimeOfClient as a8, specProblems as a9, verifiedRuntimesOf as aa, withoutBody as ab, type SkillTools as b, type AssetKind as c, CATALOG_PAGE_MAX as d, CATALOG_PAGE_SIZE as e, COMPATIBILITY_MAX as f, type CallResponse as g, type CatalogItem as h, type CatalogResponse as i, type Classified as j, DESCRIBE_FILE_LIMIT as k, DESCRIPTION_MAX as l, type FindOptions as m, type FindResult as n, type IntentCacheStats as o, MAX_SKILL_DEPTH as p, type Match as q, type MetadataLeaf as r, READ_BUDGET_BYTES as s, RUNTIMES as t, type ReadResult as u, type Runtime as v, SKIPPED_DIRS as w, type SkillBundle as x, type SkillFile as y, type SkillFileContent as z };
543
+ export { isUtf8Text as $, ASSET_KINDS as A, type BundleFile as B, type CatalogOptions as C, DEFAULT_FIND_LIMIT as D, type Embedder as E, type FileKind as F, type SkillFile as G, type SkillFileContent as H, type IntentCache as I, type SkillFileListing as J, type KindFilter as K, type SkillFilters as L, type MetadataValue as M, NAME_MAX as N, bundleResponseSchema as O, bundleSkill as P, catalogResponseSchema as Q, type Runtime as R, type SkillServerOptions as S, classify as T, cosine as U, createSkillTools as V, describeResponseSchema as W, detectRuntime as X, displayPath as Y, find as Z, findResultSchema as _, type SkillEntry as a, kindOf as a0, lexicalScore as a1, listSkillFiles as a2, mimeOf as a3, normaliseIntent as a4, frontmatterObject as a5, readBody as a6, readFrontmatter as a7, readSkillFile as a8, runtimeOfClient as a9, specProblems as aa, withoutBody as ab, type Ranking as b, type SkillTools as c, type AssetKind as d, CATALOG_PAGE_MAX as e, CATALOG_PAGE_SIZE as f, COMPATIBILITY_MAX as g, type CallResponse as h, type CatalogItem as i, type CatalogResponse as j, type Classified as k, DESCRIBE_FILE_LIMIT as l, DESCRIPTION_MAX as m, type FindOptions as n, type FindResult as o, type IntentCacheStats as p, MAX_SKILL_DEPTH as q, readCatalog as r, type Match as s, type MetadataLeaf as t, READ_BUDGET_BYTES as u, verifiedRuntimesOf as v, RUNTIMES as w, type ReadResult as x, SKIPPED_DIRS as y, type SkillBundle as z };
package/dist/stdio.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { serveStdio } from '@modelcontextprotocol/server/stdio';
3
- import { S as SkillServerOptions, C as CatalogOptions } from './server-DAcT89iv.js';
3
+ import { S as SkillServerOptions, C as CatalogOptions } from './server-VWSY3Shw.js';
4
4
  import { M as MailboxService } from './service-qpCsOXkQ.js';
5
5
  import { M as MailboxAttachmentOptions } from './attachment-tU5FZrgZ.js';
6
6
  import 'zod';
package/dist/stdio.js CHANGED
@@ -1050,7 +1050,7 @@ import { createHash as createHash2 } from "crypto";
1050
1050
 
1051
1051
  // src/intent.ts
1052
1052
  function normaliseIntent(intent) {
1053
- return intent.toLowerCase().replaceAll(/[^\p{L}\p{N}\s]/gu, " ").split(/\s+/u).filter(Boolean).join(" ");
1053
+ return intent.normalize("NFC").toLowerCase().replaceAll(/[^\p{L}\p{N}\s]/gu, " ").split(/\s+/u).filter(Boolean).join(" ");
1054
1054
  }
1055
1055
 
1056
1056
  // src/find.ts
@@ -1941,7 +1941,7 @@ function registerMailboxTools(server, service) {
1941
1941
 
1942
1942
  // src/mcp.ts
1943
1943
  var SERVER_NAME = "pmcp";
1944
- var SERVER_VERSION = "0.16.0";
1944
+ var SERVER_VERSION = "0.17.0";
1945
1945
  function registerSkillTools(server, tools) {
1946
1946
  registerCatalogTool(server, tools);
1947
1947
  registerFindTool(server, tools);
@@ -2003,6 +2003,8 @@ var MailboxError = class extends Error {
2003
2003
  this.retryable = retryable;
2004
2004
  this.name = "MailboxError";
2005
2005
  }
2006
+ code;
2007
+ retryable;
2006
2008
  };
2007
2009
  function failure(error) {
2008
2010
  if (error instanceof MailboxError) {
@@ -911,6 +911,7 @@ var Connection = class {
911
911
  constructor(records2) {
912
912
  this.records = records2;
913
913
  }
914
+ records;
914
915
  tmux(args, options = {}) {
915
916
  return command(
916
917
  "tmux",
@@ -1147,6 +1148,8 @@ var LaunchJournal = class {
1147
1148
  this.id = id2;
1148
1149
  runtimeUnit(id2);
1149
1150
  }
1151
+ records;
1152
+ id;
1150
1153
  path(kind) {
1151
1154
  if (!["intent", "proof", "grant", "committed", "aborted"].includes(kind))
1152
1155
  throw new Error("invalid_launch_artifact");
@@ -2275,6 +2278,7 @@ var Backend = class {
2275
2278
  this.runDirectory = recordStore.directory;
2276
2279
  this.metadataPath = recordStore.metadataPath;
2277
2280
  }
2281
+ recordStore;
2278
2282
  connection;
2279
2283
  owner;
2280
2284
  socket;
@@ -3413,6 +3417,7 @@ var CommonHarness = class {
3413
3417
  constructor(view) {
3414
3418
  this.view = view;
3415
3419
  }
3420
+ view;
3416
3421
  async call(family, action, input = {}) {
3417
3422
  const group = new GroupStore(this.view.groupFile).state.group;
3418
3423
  if (group.owner !== this.view.groupOwner) throw new Error("foreign_group");
@@ -3570,6 +3575,9 @@ var ViewConnection = class {
3570
3575
  this.identity = identity;
3571
3576
  this.socket = join21(directory, "s");
3572
3577
  }
3578
+ directory;
3579
+ owner;
3580
+ identity;
3573
3581
  socket;
3574
3582
  raw(args) {
3575
3583
  const env = { ...process.env };
@@ -3721,6 +3729,8 @@ var TmuxView = class {
3721
3729
  view.serverIdentity
3722
3730
  );
3723
3731
  }
3732
+ view;
3733
+ stateFile;
3724
3734
  connection;
3725
3735
  shell(argv2) {
3726
3736
  return `exec ${argv2.map(quote).join(" ")}`;
@@ -4408,6 +4418,8 @@ var MailboxError = class extends Error {
4408
4418
  this.retryable = retryable;
4409
4419
  this.name = "MailboxError";
4410
4420
  }
4421
+ code;
4422
+ retryable;
4411
4423
  };
4412
4424
  function failure(error) {
4413
4425
  if (error instanceof MailboxError) {
package/docs/hosting.md CHANGED
@@ -26,6 +26,19 @@ const skills = createSkillHttpHandler({
26
26
  export default { fetch: (request: Request) => skills.fetch(request) };
27
27
  ```
28
28
 
29
+ Import `readCatalog` and `verifiedRuntimesOf` from the same `/http` entry when
30
+ the host also displays the catalog. `verifiedRuntimesOf(metadata)` accepts an
31
+ array or a comma/whitespace-separated string, drops unknown names and removes
32
+ duplicates while preserving declaration order. Hosts that need a fixed display
33
+ order can sort the result themselves.
34
+
35
+ Pass `onReject: ({ path, reason }) => reportRejectedCatalog(path, reason)` to
36
+ observe rejected marketplace entries during startup and `reload()`. This callback
37
+ is synchronous and reports only the path and reason. A custom `loadCatalog` must
38
+ forward its options to `readCatalog` to retain rejection reporting. If the host
39
+ loads a separate site catalog, pass the callback to that load as well. Deduplicate
40
+ repeated warnings in the host and keep local paths out of public responses.
41
+
29
42
  The handler checks requests before they reach MCP:
30
43
 
31
44
  | Option | Default | Effect |
@@ -26,6 +26,9 @@ Antigravity read natively, from cross-tool sources under `.agents/`
26
26
  (`skills/<name>/SKILL.md`, `agents/<name>/agent.md`, `rules/*.md`) and the rest
27
27
  of `pmcp.toml`:
28
28
 
29
+ OpenCode additionally supports project MCP and direct skill discovery, as
30
+ described in [OpenCode project support](#opencode-project-support).
31
+
29
32
  ```toml
30
33
  [targets]
31
34
  tools = ["claude", "codex", "gemini", "grok", "antigravity"]
@@ -146,6 +149,38 @@ Configuration references: [Codex](https://developers.openai.com/codex/config-ref
146
149
  [Gemini CLI](https://geminicli.com/docs/tools/mcp-server/),
147
150
  and [Grok Build](https://docs.x.ai/build/features/mcp-servers).
148
151
 
152
+ ## OpenCode project support
153
+
154
+ Add opencode to targets.tools to project MCP entries into the project-root
155
+ opencode.json. PMCP owns only its declared mcp entries and user-only skill
156
+ permissions; existing provider, model, other servers and permission rules are
157
+ preserved. An unmanaged conflicting entry is refused. JSONC projection is not
158
+ supported; reconcile a project opencode.jsonc before projecting opencode.json.
159
+
160
+ Local servers use type=local, a command array and environment. Remote servers
161
+ use type=remote, url and native {env:NAME} header references. Optional
162
+ mcp.<name>.native.opencode.timeout uses milliseconds. Per-server tool filtering,
163
+ MCP configuration import and mailbox runtime binding are not qualified for
164
+ OpenCode; explicitly limit those servers to other targets when needed.
165
+
166
+ OpenCode discovers .agents/skills directly, so PMCP creates no skill copies or
167
+ links. For invocation=user, projection sets permission.skill.<name> to deny:
168
+ the model's skill list omits that name, while the native /<name> command still
169
+ loads its original SKILL.md and accepts user arguments. This was qualified with
170
+ OpenCode 1.18.33 using isolated native CLI calls and local scripted responses,
171
+ without an external model call. It controls automatic skill selection, not
172
+ arbitrary file access. Native global skill discovery remains a user preference.
173
+
174
+ pmcp doctor checks opencode debug skill and opencode mcp list without calling
175
+ a model. Discovery does not imply automatic visibility or native tool invocation.
176
+ Memory reporting, shell-hook enforcement, canonical agent projection and
177
+ terminal-harness support are not part of this target's current qualification.
178
+ OpenCode does not run Claude project hooks automatically.
179
+
180
+ See the [OpenCode MCP configuration](https://opencode.ai/docs/mcp-servers/),
181
+ [Agent Skills](https://opencode.ai/docs/skills/) and
182
+ [configuration precedence](https://opencode.ai/docs/config/).
183
+
149
184
  ## Operator shell guards
150
185
 
151
186
  Declare a project-owned guard explicitly to project it into Codex, Gemini or
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcp",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "mcpServers": {
5
5
  "pmcp": {
6
6
  "type": "stdio",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modootoday/pmcp",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "license": "Elastic-2.0",
5
5
  "author": "modootoday",
6
6
  "description": "Use the skills your packages already ship, and keep your AI tools' project configuration in one place.",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "pmcp",
4
- "version": "0.16.0",
4
+ "version": "0.17.0",
5
5
  "description": "Find package skills and use native runtime project configuration.",
6
6
  "author": { "name": "modootoday" },
7
7
  "license": "Elastic-2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcp",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Find package skills and use native runtime project configuration.",
5
5
  "author": { "name": "modootoday" },
6
6
  "license": "Elastic-2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcp",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "mcpServers": {
5
5
  "pmcp": {
6
6
  "type": "stdio",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "pmcp",
4
- "version": "0.16.0",
4
+ "version": "0.17.0",
5
5
  "description": "Find package skills and use native runtime project configuration.",
6
6
  "author": { "name": "modootoday" },
7
7
  "license": "Elastic-2.0",