@pathmode/mcp-server 1.11.0 → 1.12.1

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/README.md CHANGED
@@ -61,6 +61,7 @@ That's it. No API key needed.
61
61
  id: "intent_17291..."
62
62
  version: 1
63
63
  status: "draft"
64
+ readiness: "passed 6/6"
64
65
  ---
65
66
  # Fix Checkout Payment Timeout
66
67
 
@@ -78,6 +79,8 @@ timeouts exceeding 3 seconds.
78
79
  - **Unknown provider status**: Hold order, notify user within 30s
79
80
  ```
80
81
 
82
+ The `readiness` line is the deterministic preflight verdict, stamped on every save — "passed 6/6", or "failed N/6" naming the blocking gates — so any agent reading the file knows whether the spec cleared the gate without re-running it. Specs exported from a Pathmode workspace also carry `source:` (the canonical intent URL — the file is a working copy of that record) and `evidence:` (how many linked evidence items back it).
83
+
81
84
  **.cursorrules** — Agent-directive format for Cursor:
82
85
  ```
83
86
  # CURRENT OBJECTIVE
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `--version` / `--help` handling.
3
+ *
4
+ * Without this, any argument that is not a known subcommand falls through to
5
+ * StdioServerTransport, which waits on stdin forever. `npx @pathmode/mcp-server --version`
6
+ * — the first thing someone types after installing — looked like a hang.
7
+ *
8
+ * Deliberately narrow: only these exact flags are claimed. An unrecognized flag still
9
+ * starts the server, because an MCP client passing something we do not know about must
10
+ * get a working server, not a usage screen on stdout (which would corrupt the JSON-RPC
11
+ * stream). Like the other subcommands, these print to stdout and must run before the
12
+ * transport claims it.
13
+ */
14
+ export declare function isVersionCommand(argv?: string[]): boolean;
15
+ export declare function isHelpCommand(argv?: string[]): boolean;
16
+ export declare function formatVersion(version: string): string;
17
+ export declare function formatHelp(version: string): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/cli-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,wBAAgB,gBAAgB,CAAC,IAAI,WAAe,GAAG,OAAO,CAE7D;AAED,wBAAgB,aAAa,CAAC,IAAI,WAAe,GAAG,OAAO,CAE1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA6BlD"}
package/dist/index.js CHANGED
@@ -33753,6 +33753,74 @@ class PathmodeClient {
33753
33753
  exports.PathmodeClient = PathmodeClient;
33754
33754
 
33755
33755
 
33756
+ /***/ }),
33757
+
33758
+ /***/ 7198:
33759
+ /***/ ((__unused_webpack_module, exports) => {
33760
+
33761
+ "use strict";
33762
+
33763
+ /**
33764
+ * `--version` / `--help` handling.
33765
+ *
33766
+ * Without this, any argument that is not a known subcommand falls through to
33767
+ * StdioServerTransport, which waits on stdin forever. `npx @pathmode/mcp-server --version`
33768
+ * — the first thing someone types after installing — looked like a hang.
33769
+ *
33770
+ * Deliberately narrow: only these exact flags are claimed. An unrecognized flag still
33771
+ * starts the server, because an MCP client passing something we do not know about must
33772
+ * get a working server, not a usage screen on stdout (which would corrupt the JSON-RPC
33773
+ * stream). Like the other subcommands, these print to stdout and must run before the
33774
+ * transport claims it.
33775
+ */
33776
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
33777
+ exports.isVersionCommand = isVersionCommand;
33778
+ exports.isHelpCommand = isHelpCommand;
33779
+ exports.formatVersion = formatVersion;
33780
+ exports.formatHelp = formatHelp;
33781
+ const VERSION_FLAGS = new Set(['--version', '-v']);
33782
+ const HELP_FLAGS = new Set(['--help', '-h']);
33783
+ function isVersionCommand(argv = process.argv) {
33784
+ return argv.slice(2).some((a) => VERSION_FLAGS.has(a));
33785
+ }
33786
+ function isHelpCommand(argv = process.argv) {
33787
+ return argv.slice(2).some((a) => HELP_FLAGS.has(a));
33788
+ }
33789
+ function formatVersion(version) {
33790
+ return `@pathmode/mcp-server ${version}`;
33791
+ }
33792
+ function formatHelp(version) {
33793
+ return [
33794
+ formatVersion(version),
33795
+ '',
33796
+ 'MCP server for Pathmode — intent specs your coding agent can read.',
33797
+ '',
33798
+ 'USAGE',
33799
+ ' npx @pathmode/mcp-server Start the server (stdio). This is what an',
33800
+ ' MCP client runs; it waits on stdin by design.',
33801
+ ' npx @pathmode/mcp-server setup [key] Configure Claude Code/Desktop, Cursor, Windsurf.',
33802
+ ' npx @pathmode/mcp-server install-skills Install the skill pack into this project.',
33803
+ ' npx @pathmode/mcp-server --version Print the version.',
33804
+ ' npx @pathmode/mcp-server --help Print this help.',
33805
+ '',
33806
+ 'MODES',
33807
+ ' Local (default, no key) Specs live in intent.md in your repo. Nothing leaves the machine.',
33808
+ ' Cloud (with a key) Syncs intent and evidence with a Pathmode workspace.',
33809
+ ' Set PATHMODE_API_KEY, or run setup with a pm_live_ key.',
33810
+ '',
33811
+ 'FLAGS',
33812
+ ' --local Force local mode even when an API key is configured.',
33813
+ '',
33814
+ 'ENVIRONMENT',
33815
+ ' PATHMODE_API_KEY Workspace key (pm_live_…). Absent means local mode.',
33816
+ ' PATHMODE_API_URL Override the API base URL. Defaults to https://pathmode.io',
33817
+ ' PATHMODE_MCP_DEBUG=1 Log the inferred mode to stderr on startup.',
33818
+ '',
33819
+ 'Docs: https://pathmode.io/developers · Preflight: https://preflight.pathmode.io',
33820
+ ].join('\n');
33821
+ }
33822
+
33823
+
33756
33824
  /***/ }),
33757
33825
 
33758
33826
  /***/ 3783:
@@ -34165,6 +34233,8 @@ function formatIntentMd(spec, opts = {}) {
34165
34233
  id: spec.id || `intent_${Date.now()}`,
34166
34234
  version: opts.version && opts.version >= 1 ? opts.version : 1,
34167
34235
  status: opts.status || 'draft',
34236
+ ...(opts.readiness ? { readiness: opts.readiness } : {}),
34237
+ ...(opts.source ? { source: opts.source } : {}),
34168
34238
  created: opts.created || now,
34169
34239
  updated: now,
34170
34240
  };
@@ -35034,6 +35104,7 @@ exports.isVerificationCheckSubstantive = isVerificationCheckSubstantive;
35034
35104
  exports.isObjectiveSpecific = isObjectiveSpecific;
35035
35105
  exports.isOutcomeMeasurable = isOutcomeMeasurable;
35036
35106
  exports.computeReadinessVerdict = computeReadinessVerdict;
35107
+ exports.formatReadinessFrontmatter = formatReadinessFrontmatter;
35037
35108
  exports.formatReadinessVerdict = formatReadinessVerdict;
35038
35109
  // ── Text/shape coercion (mirrors lib/intentReadiness coerceText/asArray) ───
35039
35110
  function coerceText(value) {
@@ -35205,6 +35276,29 @@ const GATE_LABELS = {
35205
35276
  edgeCases: 'Edge cases',
35206
35277
  verification: 'Verification',
35207
35278
  };
35279
+ /** Gate keys → short labels for the frontmatter blocking list. */
35280
+ const FRONTMATTER_GATE_LABELS = {
35281
+ goal: 'title',
35282
+ objective: 'objective',
35283
+ outcomes: 'outcomes',
35284
+ constraints: 'constraints',
35285
+ edgeCases: 'edge-cases',
35286
+ verification: 'verification',
35287
+ };
35288
+ /**
35289
+ * Single-line readiness value stamped into intent.md frontmatter, so the verdict travels
35290
+ * with the file: "passed 6/6" or "failed 4/6 — blocking: constraints, verification".
35291
+ * Deterministic and greppable. Mirrored in lib/intentReadiness.formatReadinessFrontmatter;
35292
+ * lib/preflightReadinessParity.test.ts fails CI if the two drift.
35293
+ */
35294
+ function formatReadinessFrontmatter(verdict) {
35295
+ const total = exports.READINESS_GATE_ORDER.length;
35296
+ const passed = exports.READINESS_GATE_ORDER.filter((k) => verdict.signals[k]).length;
35297
+ if (verdict.ready)
35298
+ return `passed ${passed}/${total}`;
35299
+ const blocking = exports.READINESS_GATE_ORDER.filter((k) => !verdict.signals[k]).map((k) => FRONTMATTER_GATE_LABELS[k]);
35300
+ return `failed ${passed}/${total} — blocking: ${blocking.join(', ')}`;
35301
+ }
35208
35302
  /** Human/agent-readable verdict block, stable enough to parse by line prefix. */
35209
35303
  function formatReadinessVerdict(verdict, specTitle) {
35210
35304
  const lines = [];
@@ -65155,7 +65249,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"$schema":"http://json-schema.org/dra
65155
65249
  /***/ ((module) => {
65156
65250
 
65157
65251
  "use strict";
65158
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@pathmode/mcp-server","version":"1.11.0","publishConfig":{"access":"public"},"mcpName":"io.github.pathmodeio/mcp-server","description":"Pathmode MCP Server — Build structured intent specs through Socratic AI conversation (zero-config), or connect to your Intent Layer for strategic context, dependency graphs, and implementation prompts.","main":"dist/index.js","bin":{"pathmode-mcp":"dist/index.js"},"files":["dist/","manifest.json","icon.svg","README.md","skills/"],"scripts":{"build":"rm -rf dist && ncc build src/index.ts -o dist","dev":"ts-node src/index.ts","prepublishOnly":"npm run build"},"keywords":["pathmode","mcp","model-context-protocol","claude-code","claude-code-skills","agent-skills","cursor","windsurf","intent-engineering","intent-compiler","ai-agents","product-development","dependency-graph","strategic-planning"],"author":"Pathmode","license":"MIT","type":"commonjs","engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/pathmodeio/mcp-server.git","directory":"packages/mcp-server"},"homepage":"https://pathmode.io","dependencies":{"@modelcontextprotocol/sdk":"^1.12.1","gray-matter":"^4.0.3","zod":"^3.24.0"},"devDependencies":{"@types/node":"^25.1.0","@vercel/ncc":"^0.38.4","ts-node":"^10.9.2","typescript":"^5.9.3"}}');
65252
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@pathmode/mcp-server","version":"1.12.1","publishConfig":{"access":"public"},"mcpName":"io.github.pathmodeio/mcp-server","description":"Pathmode MCP Server — Build structured intent specs through Socratic AI conversation (zero-config), or connect to your Intent Layer for strategic context, dependency graphs, and implementation prompts.","main":"dist/index.js","bin":{"pathmode-mcp":"dist/index.js"},"files":["dist/","manifest.json","icon.svg","README.md","skills/"],"scripts":{"build":"rm -rf dist && ncc build src/index.ts -o dist","dev":"ts-node src/index.ts","prepublishOnly":"npm run build"},"keywords":["pathmode","mcp","model-context-protocol","claude-code","claude-code-skills","agent-skills","cursor","windsurf","intent-engineering","intent-compiler","ai-agents","product-development","dependency-graph","strategic-planning"],"author":"Pathmode","license":"MIT","type":"commonjs","engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/pathmodeio/mcp-server.git","directory":"packages/mcp-server"},"homepage":"https://pathmode.io","dependencies":{"@modelcontextprotocol/sdk":"^1.12.1","gray-matter":"^4.0.3","zod":"^3.24.0"},"devDependencies":{"@types/node":"^25.1.0","@vercel/ncc":"^0.38.4","ts-node":"^10.9.2","typescript":"^5.9.3"}}');
65159
65253
 
65160
65254
  /***/ })
65161
65255
 
@@ -65257,15 +65351,24 @@ const intent_compiler_1 = __nccwpck_require__(6488);
65257
65351
  const pathmode_section_1 = __nccwpck_require__(4681);
65258
65352
  const setup_1 = __nccwpck_require__(8294);
65259
65353
  const install_skills_1 = __nccwpck_require__(3783);
65354
+ const cli_info_1 = __nccwpck_require__(7198);
65260
65355
  // Server version is sourced from package.json so the version reported to MCP
65261
65356
  // clients always matches the published package. ncc statically resolves this
65262
65357
  // require() and inlines the JSON at build time (no runtime fs read).
65263
65358
  const { version: SERVER_VERSION } = __nccwpck_require__(8330);
65264
65359
  // ─── Subcommand routing ───────────────────────────────────────
65265
- // Human-readable subcommands (`setup`, `install-skills`) use stdout
65360
+ // Human-readable subcommands (`setup`, `install-skills`, `--version`, `--help`) use stdout
65266
65361
  // and must run before StdioServerTransport claims stdout for JSON-RPC.
65267
65362
  // We call startMcpServer() only when NOT in a subcommand.
65268
- if ((0, setup_1.isSetupCommand)()) {
65363
+ if ((0, cli_info_1.isVersionCommand)()) {
65364
+ console.log((0, cli_info_1.formatVersion)(SERVER_VERSION));
65365
+ process.exit(0);
65366
+ }
65367
+ else if ((0, cli_info_1.isHelpCommand)()) {
65368
+ console.log((0, cli_info_1.formatHelp)(SERVER_VERSION));
65369
+ process.exit(0);
65370
+ }
65371
+ else if ((0, setup_1.isSetupCommand)()) {
65269
65372
  (0, setup_1.runSetup)().then(() => process.exit(0)).catch((err) => {
65270
65373
  console.error(err);
65271
65374
  process.exit(1);
@@ -66354,13 +66457,20 @@ function startMcpServer() {
66354
66457
  };
66355
66458
  }
66356
66459
  const { id, version, status, created } = decision;
66357
- const content = (0, intent_compiler_1.formatIntentMd)({ ...spec, id }, { version, status, created });
66460
+ // The preflight verdict travels with the file: stamped into frontmatter on every save,
66461
+ // recomputed from the spec alone (deterministic). A failing verdict never blocks the
66462
+ // save — the gate reports, the user decides.
66463
+ const verdict = (0, readiness_1.computeReadinessVerdict)(spec);
66464
+ const content = (0, intent_compiler_1.formatIntentMd)({ ...spec, id }, { version, status, created, readiness: (0, readiness_1.formatReadinessFrontmatter)(verdict) });
66358
66465
  (0, fs_1.writeFileSync)(filePath, content, 'utf-8');
66359
66466
  const action = decision.action === 'update' ? `Updated intent spec (v${version})` : 'Saved intent spec';
66467
+ const readinessNote = verdict.ready
66468
+ ? ''
66469
+ : `\n\n${(0, readiness_1.formatReadinessVerdict)(verdict, spec.title)}`;
66360
66470
  return {
66361
66471
  content: [{
66362
66472
  type: 'text',
66363
- text: `✓ ${action} at ${filePath}\n id: ${id} · status: ${status}\n\nTo connect this to Pathmode for dependency tracking and team collaboration, visit pathmode.io`,
66473
+ text: `✓ ${action} at ${filePath}\n id: ${id} · status: ${status} · readiness: ${(0, readiness_1.formatReadinessFrontmatter)(verdict)}${readinessNote}\n\nTo connect this to Pathmode for dependency tracking and team collaboration, visit pathmode.io`,
66364
66474
  }],
66365
66475
  };
66366
66476
  });
@@ -83,6 +83,10 @@ export interface IntentMdOptions {
83
83
  status?: string;
84
84
  /** Original `created` timestamp. Preserved across updates; defaults to now. */
85
85
  created?: string;
86
+ /** Preflight verdict line ("passed 6/6" / "failed 4/6 — blocking: …"), recomputed at save time. */
87
+ readiness?: string;
88
+ /** Canonical record URL (cloud intents). Omitted when this file is the only copy. */
89
+ source?: string;
86
90
  }
87
91
  /**
88
92
  * Generate intent.md content with YAML frontmatter.
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/intent-compiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/intent-compiler.ts"],"names":[],"mappings":"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"}
@@ -42,5 +42,12 @@ export interface ReadinessVerdict {
42
42
  * (the legacy phase-engagement signal never gates the verdict here).
43
43
  */
44
44
  export declare function computeReadinessVerdict(spec: ReadinessSpecInput): ReadinessVerdict;
45
+ /**
46
+ * Single-line readiness value stamped into intent.md frontmatter, so the verdict travels
47
+ * with the file: "passed 6/6" or "failed 4/6 — blocking: constraints, verification".
48
+ * Deterministic and greppable. Mirrored in lib/intentReadiness.formatReadinessFrontmatter;
49
+ * lib/preflightReadinessParity.test.ts fails CI if the two drift.
50
+ */
51
+ export declare function formatReadinessFrontmatter(verdict: ReadinessVerdict): string;
45
52
  /** Human/agent-readable verdict block, stable enough to parse by line prefix. */
46
53
  export declare function formatReadinessVerdict(verdict: ReadinessVerdict, specTitle?: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/readiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQjD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,CAIjE;AAoCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQ3E;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI5D;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI9F;AAQD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAOjF;AAQD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKzD;AAID,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOjE,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,wFAAyF,CAAC;AAK3H,qFAAqF;AACrF,MAAM,WAAW,kBAAkB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC7B;AAoBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,CAkBlF;AAWD,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5F"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/readiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQjD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,CAIjE;AAoCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAQ3E;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI5D;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI9F;AAQD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAOjF;AAQD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKzD;AAID,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOjE,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,wFAAyF,CAAC;AAK3H,qFAAqF;AACrF,MAAM,WAAW,kBAAkB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC7B;AAoBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,CAkBlF;AAqBD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAM5E;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5F"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pathmode/mcp-server",
3
- "version": "1.11.0",
3
+ "version": "1.12.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -30,6 +30,8 @@ If the verdict passes: say so and stop. Do not invent extra requirements beyond
30
30
 
31
31
  The gate is pure functions over the spec text: no model call, no network. Re-running never changes the verdict unless the spec changed. That makes it a floor you can put in front of any implementation work — and it means a passing verdict is reproducible evidence, not an opinion. The same gate runs live at preflight.pathmode.io.
32
32
 
33
+ Every `intent_save` also stamps the verdict into the file's frontmatter as `readiness:` ("passed 6/6", or "failed N/6" with the blocking gates named), so anyone reading intent.md — human or agent — sees the gate state without re-running anything. A failing verdict never blocks the save; the gate reports, the user decides.
34
+
33
35
  ## Division of labor with the other skills
34
36
 
35
37
  - `preflight` — deterministic verdict: IS the spec ready? Cheap, run it first and often.