@pathmode/mcp-server 1.26.3 → 1.27.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.
- package/dist/index.js +297 -50
- package/dist/packages/intentspec-format/serializeIntentMd.d.ts +20 -0
- package/dist/packages/intentspec-format/serializeIntentMd.d.ts.map +1 -1
- package/dist/packages/mcp-server/src/local-reader.d.ts.map +1 -1
- package/dist/packages/mcp-server/src/readiness.d.ts +12 -0
- package/dist/packages/mcp-server/src/readiness.d.ts.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -39218,10 +39218,13 @@ module.exports = function(str) {
|
|
|
39218
39218
|
* the results in as plain data.
|
|
39219
39219
|
*/
|
|
39220
39220
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
39221
|
+
exports.GENERATED_CAPTIONS = exports.VERIFICATION_NOT_DEFINED_CAPTION = exports.VERIFICATION_FEEDBACK_CAPTION = void 0;
|
|
39221
39222
|
exports.renderOutcomeMeasurementDefinition = renderOutcomeMeasurementDefinition;
|
|
39222
39223
|
exports.toSerializableChecks = toSerializableChecks;
|
|
39223
39224
|
exports.renderAuthorizationGateText = renderAuthorizationGateText;
|
|
39224
39225
|
exports.renderConfirmationsBody = renderConfirmationsBody;
|
|
39226
|
+
exports.normalizeCaption = normalizeCaption;
|
|
39227
|
+
exports.isGeneratedCaption = isGeneratedCaption;
|
|
39225
39228
|
exports.serializeIntentMd = serializeIntentMd;
|
|
39226
39229
|
// ── Small helpers ───────────────────────────────────────────────────────────
|
|
39227
39230
|
const VERIFICATION_KIND_LABELS = {
|
|
@@ -39378,6 +39381,38 @@ const FRONTMATTER_ORDER = [
|
|
|
39378
39381
|
'origin', 'authorization', 'authorizationNote', 'outcomeMeasurements',
|
|
39379
39382
|
'evidence', 'space', 'severity', 'created', 'updated',
|
|
39380
39383
|
];
|
|
39384
|
+
/**
|
|
39385
|
+
* Captions this codebase writes into an intent.md, as opposed to anything an author wrote.
|
|
39386
|
+
*
|
|
39387
|
+
* A caption is prose under a heading that is NOT content: it explains the section rather than
|
|
39388
|
+
* recording a decision. The readers exclude exactly these strings, which is why they live here,
|
|
39389
|
+
* next to the code that emits them, and are imported rather than retyped. Excluding "all italic
|
|
39390
|
+
* prose" instead was wrong: an author writing `*Must not slow down page load.*` under
|
|
39391
|
+
* Constraints means it, and reporting that section as absent is the accusation the four-state
|
|
39392
|
+
* gate exists to stop making.
|
|
39393
|
+
*
|
|
39394
|
+
* Adding a caption anywhere means adding it here, or the reader will grade it as content.
|
|
39395
|
+
*/
|
|
39396
|
+
exports.VERIFICATION_FEEDBACK_CAPTION = '_A feedback loop, not just a test list._';
|
|
39397
|
+
/** Written by lib/scan/draftIntentMd.ts when a pre-account draft has no verification yet. */
|
|
39398
|
+
exports.VERIFICATION_NOT_DEFINED_CAPTION = '_Not defined yet. Nothing in this spec has been checked against a running system._';
|
|
39399
|
+
exports.GENERATED_CAPTIONS = [
|
|
39400
|
+
exports.VERIFICATION_FEEDBACK_CAPTION,
|
|
39401
|
+
exports.VERIFICATION_NOT_DEFINED_CAPTION,
|
|
39402
|
+
];
|
|
39403
|
+
/** Trim, drop one layer of surrounding `_` or `*`, casefold. Both emphasis spellings match. */
|
|
39404
|
+
function normalizeCaption(line) {
|
|
39405
|
+
return line
|
|
39406
|
+
.trim()
|
|
39407
|
+
.replace(/^([_*])(.*)\1$/s, '$2')
|
|
39408
|
+
.trim()
|
|
39409
|
+
.toLowerCase();
|
|
39410
|
+
}
|
|
39411
|
+
const NORMALIZED_CAPTIONS = new Set(exports.GENERATED_CAPTIONS.map(normalizeCaption));
|
|
39412
|
+
/** True only for a caption this codebase generated. Author prose, italic or not, is content. */
|
|
39413
|
+
function isGeneratedCaption(line) {
|
|
39414
|
+
return NORMALIZED_CAPTIONS.has(normalizeCaption(line));
|
|
39415
|
+
}
|
|
39381
39416
|
function serializeIntentMd(spec, opts = {}) {
|
|
39382
39417
|
const outcomeMeasurements = (spec.outcomes || [])
|
|
39383
39418
|
.map(outcomeOf)
|
|
@@ -39531,7 +39566,7 @@ function serializeIntentMd(spec, opts = {}) {
|
|
|
39531
39566
|
if (checkGroups.length) {
|
|
39532
39567
|
sections.push('');
|
|
39533
39568
|
sections.push('## Verification');
|
|
39534
|
-
sections.push(
|
|
39569
|
+
sections.push(exports.VERIFICATION_FEEDBACK_CAPTION);
|
|
39535
39570
|
for (const g of checkGroups) {
|
|
39536
39571
|
sections.push(`**${g.label}**:`);
|
|
39537
39572
|
for (const c of g.checks)
|
|
@@ -41189,6 +41224,7 @@ const fs_1 = __importDefault(__nccwpck_require__(9896));
|
|
|
41189
41224
|
const path_1 = __importDefault(__nccwpck_require__(6928));
|
|
41190
41225
|
const gray_matter_1 = __importDefault(__nccwpck_require__(9599));
|
|
41191
41226
|
const measurement_schema_1 = __nccwpck_require__(1635);
|
|
41227
|
+
const serializeIntentMd_1 = __nccwpck_require__(229);
|
|
41192
41228
|
const CONFIRMATION_HEADER_RE = /^\*\*(objective|outcomes)\*\*\s*[—–-]\s*(confirmed|waived)\s+by\s+(agent|human)\s*$/i;
|
|
41193
41229
|
const CONFIRMATION_FIELD_RE = /^\s*[-*]\s+(actor|problem|outcome|observable|reason|anchor|at)\s*:\s*(.+)$/i;
|
|
41194
41230
|
/**
|
|
@@ -41362,7 +41398,6 @@ function parseIntentMarkdown(content, fallbackId = 'intent') {
|
|
|
41362
41398
|
const { data, content: rawBody } = (0, gray_matter_1.default)(content);
|
|
41363
41399
|
const body = stripHtmlComments(stripFencedBlocks(rawBody));
|
|
41364
41400
|
const sections = splitSections(body);
|
|
41365
|
-
const parsedVerification = extractVerification(sections);
|
|
41366
41401
|
// The public schema allows verification as a flat string array; read it as manual checks
|
|
41367
41402
|
// rather than silently producing {} (the same adapter normalizeSpecForReadiness applies).
|
|
41368
41403
|
const frontmatterVerification = Array.isArray(data.verification)
|
|
@@ -41370,9 +41405,16 @@ function parseIntentMarkdown(content, fallbackId = 'intent') {
|
|
|
41370
41405
|
: data.verification && typeof data.verification === 'object'
|
|
41371
41406
|
? data.verification
|
|
41372
41407
|
: null;
|
|
41373
|
-
|
|
41374
|
-
|
|
41375
|
-
|
|
41408
|
+
// Same precedence as every other section: body list, then frontmatter, then body prose.
|
|
41409
|
+
const verificationAll = extractVerification(sections);
|
|
41410
|
+
const verificationHasList = hasVerificationContent(extractVerification(sections, { includeProse: false }));
|
|
41411
|
+
const verification = verificationHasList
|
|
41412
|
+
? verificationAll
|
|
41413
|
+
: frontmatterVerification && hasVerificationContent(frontmatterVerification)
|
|
41414
|
+
? frontmatterVerification
|
|
41415
|
+
: hasVerificationContent(verificationAll)
|
|
41416
|
+
? verificationAll
|
|
41417
|
+
: (frontmatterVerification || {});
|
|
41376
41418
|
const version = Number(data.version);
|
|
41377
41419
|
return {
|
|
41378
41420
|
id: data.id || fallbackId,
|
|
@@ -41384,11 +41426,19 @@ function parseIntentMarkdown(content, fallbackId = 'intent') {
|
|
|
41384
41426
|
title: data.title || data.userGoal || extractTitle(body) || 'Untitled Intent',
|
|
41385
41427
|
stageName: data.stage || undefined,
|
|
41386
41428
|
severity: data.severity || undefined,
|
|
41387
|
-
outcomes: attachOutcomeMeasurements(
|
|
41429
|
+
outcomes: attachOutcomeMeasurements(preferListThenFrontmatter(sections, 'Outcomes', data.outcomes), data.outcomeMeasurements),
|
|
41388
41430
|
decisions: extractDecisions(sections),
|
|
41389
|
-
constraints:
|
|
41390
|
-
edgeCases: (() => {
|
|
41391
|
-
|
|
41431
|
+
constraints: preferListThenFrontmatter(sections, 'Constraints', data.constraints),
|
|
41432
|
+
edgeCases: (() => {
|
|
41433
|
+
const all = extractEdgeCases(sections);
|
|
41434
|
+
if (extractEdgeCases(sections, { includeProse: false }).length)
|
|
41435
|
+
return all;
|
|
41436
|
+
const fromFrontmatter = frontmatterEdgeCases(data.edgeCases);
|
|
41437
|
+
if (fromFrontmatter.length)
|
|
41438
|
+
return fromFrontmatter;
|
|
41439
|
+
return all;
|
|
41440
|
+
})(),
|
|
41441
|
+
healthMetrics: preferListThenFrontmatter(sections, 'Health Metrics', data.healthMetrics),
|
|
41392
41442
|
scope: extractScope(sections) || undefined,
|
|
41393
41443
|
verification,
|
|
41394
41444
|
confirmations: extractConfirmations(sections),
|
|
@@ -41502,17 +41552,115 @@ function stripListMarker(line) {
|
|
|
41502
41552
|
function isListItem(line) {
|
|
41503
41553
|
return /^\s*[-*]\s/.test(line);
|
|
41504
41554
|
}
|
|
41505
|
-
|
|
41506
|
-
|
|
41507
|
-
|
|
41508
|
-
|
|
41509
|
-
|
|
41555
|
+
/**
|
|
41556
|
+
* Structure and generated captions are not content; everything else under a heading is.
|
|
41557
|
+
*
|
|
41558
|
+
* Two distinct exclusions, and they are not the same rule:
|
|
41559
|
+
*
|
|
41560
|
+
* A heading line is structure. `splitSections` only opens a section on `^## `, so a `### Regression
|
|
41561
|
+
* checks` subheading falls through as a body line, and treating it as prose made the HEADING an
|
|
41562
|
+
* executable check: a `## Verification` containing nothing but subheadings passed the gate.
|
|
41563
|
+
*
|
|
41564
|
+
* A generated caption is ours, not the author's, and the registry in serializeIntentMd.ts names
|
|
41565
|
+
* exactly which strings those are. This deliberately does NOT exclude all italic prose: an author
|
|
41566
|
+
* writing `*Must not slow down page load.*` under Constraints means it, and reporting that section
|
|
41567
|
+
* as absent is the accusation the four-state gate exists to stop making.
|
|
41568
|
+
*/
|
|
41569
|
+
function isNotContent(line) {
|
|
41570
|
+
return /^#{1,6}\s/.test(line.trim()) || (0, serializeIntentMd_1.isGeneratedCaption)(line);
|
|
41571
|
+
}
|
|
41572
|
+
/**
|
|
41573
|
+
* Items in a section, preserving what the author actually wrote.
|
|
41574
|
+
*
|
|
41575
|
+
* List items keep their existing boundaries: one item per marker, with an indented
|
|
41576
|
+
* continuation line folded into the item it wraps. A run of unindented non-list lines is one
|
|
41577
|
+
* paragraph, and one paragraph is one item; blank lines separate paragraphs. Prose is never
|
|
41578
|
+
* split into sentences, so an author who writes two independently checkable outcomes as two
|
|
41579
|
+
* paragraphs gets two items and one who writes them as a single block gets one.
|
|
41580
|
+
*
|
|
41581
|
+
* Before this, a `.filter(isListItem)` dropped every prose line here and the gates then
|
|
41582
|
+
* reported the section as `absent`, which told an author who had written a constraint in prose
|
|
41583
|
+
* that they had written nothing. Preserving the text is what lets readiness say `unconfirmed`
|
|
41584
|
+
* and quote it back instead. The gates themselves are unchanged: nothing about the parse
|
|
41585
|
+
* relaxes a threshold, and a formatting choice never earns a pass it would not otherwise get.
|
|
41586
|
+
*/
|
|
41587
|
+
function extractItemsSection(sections, heading, { includeProse = true } = {}) {
|
|
41588
|
+
const items = [];
|
|
41589
|
+
let paragraph = [];
|
|
41590
|
+
let lastWasListItem = false;
|
|
41591
|
+
const flushParagraph = () => {
|
|
41592
|
+
const text = paragraph.join(' ').replace(/\s+/g, ' ').trim();
|
|
41593
|
+
if (text)
|
|
41594
|
+
items.push(text);
|
|
41595
|
+
paragraph = [];
|
|
41596
|
+
};
|
|
41597
|
+
for (const line of sectionLines(sections, heading)) {
|
|
41598
|
+
if (!line.trim()) {
|
|
41599
|
+
flushParagraph();
|
|
41600
|
+
lastWasListItem = false;
|
|
41601
|
+
continue;
|
|
41602
|
+
}
|
|
41603
|
+
// Structure and generated captions are checked FIRST, so neither can be folded into the
|
|
41604
|
+
// item above it or accumulated into a paragraph. A subheading is not a wrapped bullet.
|
|
41605
|
+
if (isNotContent(line)) {
|
|
41606
|
+
flushParagraph();
|
|
41607
|
+
lastWasListItem = false;
|
|
41608
|
+
continue;
|
|
41609
|
+
}
|
|
41610
|
+
if (isListItem(line)) {
|
|
41611
|
+
flushParagraph();
|
|
41612
|
+
const text = stripListMarker(line);
|
|
41613
|
+
lastWasListItem = Boolean(text);
|
|
41614
|
+
if (text)
|
|
41615
|
+
items.push(text);
|
|
41616
|
+
continue;
|
|
41617
|
+
}
|
|
41618
|
+
// A non-blank line straight after a list item is that item's wrapped text, not a new
|
|
41619
|
+
// item. Markdown lazy continuation does not require indentation, and requiring it let a
|
|
41620
|
+
// hard-wrapped bullet split into two items: wrapping must never manufacture an outcome
|
|
41621
|
+
// that clears the two-outcome gate. A blank line is what ends an item. This runs
|
|
41622
|
+
// whatever `includeProse` says, because wrapped text belongs to the list item, not to
|
|
41623
|
+
// the prose the flag governs.
|
|
41624
|
+
if (lastWasListItem && items.length) {
|
|
41625
|
+
items[items.length - 1] = `${items[items.length - 1]} ${line.trim()}`.replace(/\s+/g, ' ');
|
|
41626
|
+
continue;
|
|
41627
|
+
}
|
|
41628
|
+
if (!includeProse) {
|
|
41629
|
+
flushParagraph();
|
|
41630
|
+
lastWasListItem = false;
|
|
41631
|
+
continue;
|
|
41632
|
+
}
|
|
41633
|
+
lastWasListItem = false;
|
|
41634
|
+
paragraph.push(line.trim());
|
|
41635
|
+
}
|
|
41636
|
+
flushParagraph();
|
|
41637
|
+
return items;
|
|
41510
41638
|
}
|
|
41511
41639
|
/**
|
|
41512
41640
|
* Parse `## Decisions & Ruled-Out Alternatives` entries written by `decisionLines()`:
|
|
41513
41641
|
* - **choice** (instead of: ruledOut) — reason
|
|
41514
41642
|
* The separator is an em dash when written by us; a plain hyphen is accepted for hand-edited files.
|
|
41515
41643
|
*/
|
|
41644
|
+
/**
|
|
41645
|
+
* A section that has list items owns the field, prose included. A section that is prose only
|
|
41646
|
+
* yields to frontmatter, and is read only when there is no frontmatter to yield to.
|
|
41647
|
+
*
|
|
41648
|
+
* The middle step is the published normalization rule, conformance case "list fallback: a
|
|
41649
|
+
* section with no list items does not override frontmatter": prose under a heading must not
|
|
41650
|
+
* erase a structured frontmatter value. It is a rule about OVERRIDE, not about ignoring prose,
|
|
41651
|
+
* so a section mixing a bullet and a paragraph keeps both. The last step is the defect this
|
|
41652
|
+
* change exists for: with nothing in frontmatter either, prose used to vanish and the gate
|
|
41653
|
+
* reported the section as `absent`, telling the author they had written nothing.
|
|
41654
|
+
*/
|
|
41655
|
+
function preferListThenFrontmatter(sections, heading, fromFrontmatter) {
|
|
41656
|
+
const all = extractItemsSection(sections, heading);
|
|
41657
|
+
if (extractItemsSection(sections, heading, { includeProse: false }).length)
|
|
41658
|
+
return all;
|
|
41659
|
+
const frontmatter = preferSection([], fromFrontmatter);
|
|
41660
|
+
if (frontmatter.length)
|
|
41661
|
+
return frontmatter;
|
|
41662
|
+
return all;
|
|
41663
|
+
}
|
|
41516
41664
|
function extractDecisions(sections) {
|
|
41517
41665
|
const out = [];
|
|
41518
41666
|
for (const line of sectionLines(sections, DECISIONS_HEADING)) {
|
|
@@ -41531,12 +41679,11 @@ function extractDecisions(sections) {
|
|
|
41531
41679
|
}
|
|
41532
41680
|
return out;
|
|
41533
41681
|
}
|
|
41534
|
-
function extractEdgeCases(sections) {
|
|
41682
|
+
function extractEdgeCases(sections, opts = {}) {
|
|
41535
41683
|
const cases = [];
|
|
41536
|
-
|
|
41537
|
-
|
|
41538
|
-
|
|
41539
|
-
const clean = stripListMarker(line);
|
|
41684
|
+
// Items come from the shared reader, so a prose paragraph is an item exactly as a bullet is
|
|
41685
|
+
// and the pair patterns below are applied to both. Nothing here depends on the formatting.
|
|
41686
|
+
for (const clean of extractItemsSection(sections, 'Edge Cases', opts)) {
|
|
41540
41687
|
// Pattern: **scenario**: expected behavior
|
|
41541
41688
|
const match = clean.match(/^\*\*(.+?)\*\*:\s*(.+)$/);
|
|
41542
41689
|
if (match) {
|
|
@@ -41550,7 +41697,13 @@ function extractEdgeCases(sections) {
|
|
|
41550
41697
|
const arrowMatch = clean.match(/^(.+?)\s*(?:->|→|:)\s*(.+)$/);
|
|
41551
41698
|
if (arrowMatch) {
|
|
41552
41699
|
cases.push({ scenario: arrowMatch[1].trim(), expectedBehavior: arrowMatch[2].trim() });
|
|
41700
|
+
continue;
|
|
41553
41701
|
}
|
|
41702
|
+
// No pair in it. Keep the scenario so readiness can quote it back and ask for the
|
|
41703
|
+
// expected behavior, and leave `expectedBehavior` empty: the gate requires both, so an
|
|
41704
|
+
// unpaired item cannot pass, and no behavior is invented for the author. Dropping it,
|
|
41705
|
+
// which is what happened before, reported the section as absent instead.
|
|
41706
|
+
cases.push({ scenario: clean, expectedBehavior: '' });
|
|
41554
41707
|
}
|
|
41555
41708
|
return cases;
|
|
41556
41709
|
}
|
|
@@ -41634,7 +41787,7 @@ function parseVerificationLabel(line) {
|
|
|
41634
41787
|
* ("E2E Tests", "Unit Tests", "Manual Checks") keep their string-array buckets, which
|
|
41635
41788
|
* `toVerificationChecks()` in intent-compiler.ts adapts on read.
|
|
41636
41789
|
*/
|
|
41637
|
-
function extractVerification(sections) {
|
|
41790
|
+
function extractVerification(sections, { includeProse = true } = {}) {
|
|
41638
41791
|
const lines = sectionLines(sections, 'Verification');
|
|
41639
41792
|
if (lines.length === 0)
|
|
41640
41793
|
return {};
|
|
@@ -41642,9 +41795,55 @@ function extractVerification(sections) {
|
|
|
41642
41795
|
let currentKind = null;
|
|
41643
41796
|
let currentLegacy = null;
|
|
41644
41797
|
let sawLabel = false;
|
|
41798
|
+
// Prose is preserved here on the same terms as everywhere else: a run of unindented
|
|
41799
|
+
// non-list lines is one paragraph and one check, attributed to the bucket it was written
|
|
41800
|
+
// under, and an indented wrap folds into the check above it rather than becoming a check of
|
|
41801
|
+
// its own. A bullet parses exactly as it did before.
|
|
41802
|
+
const paragraph = [];
|
|
41803
|
+
// A holder, not a bare `let`: TypeScript narrows a variable assigned only inside
|
|
41804
|
+
// closures down to its initializer, and the call below then reads as `never`.
|
|
41805
|
+
const last = { append: null };
|
|
41806
|
+
const pushText = (text) => {
|
|
41807
|
+
if (currentKind) {
|
|
41808
|
+
const { description, status, verifies } = parseCheckLine(text);
|
|
41809
|
+
if (!description) {
|
|
41810
|
+
last.append = null;
|
|
41811
|
+
return;
|
|
41812
|
+
}
|
|
41813
|
+
const check = { kind: currentKind, description };
|
|
41814
|
+
if (status)
|
|
41815
|
+
check.status = status;
|
|
41816
|
+
if (verifies)
|
|
41817
|
+
check.verifies = verifies;
|
|
41818
|
+
(result.checks ||= []).push(check);
|
|
41819
|
+
last.append = (extra) => { check.description = `${check.description} ${extra}`.replace(/\s+/g, ' '); };
|
|
41820
|
+
return;
|
|
41821
|
+
}
|
|
41822
|
+
const bucket = currentLegacy
|
|
41823
|
+
? (result[currentLegacy] ||= [])
|
|
41824
|
+
// IntentSpec labels are optional. Treat an ungrouped item as a manual check so a
|
|
41825
|
+
// valid flat `## Verification` section survives adoption instead of disappearing.
|
|
41826
|
+
: sawLabel ? null : (result.manualChecks ||= []);
|
|
41827
|
+
if (!bucket) {
|
|
41828
|
+
last.append = null;
|
|
41829
|
+
return;
|
|
41830
|
+
}
|
|
41831
|
+
bucket.push(text);
|
|
41832
|
+
last.append = (extra) => { bucket[bucket.length - 1] = `${bucket[bucket.length - 1]} ${extra}`.replace(/\s+/g, ' '); };
|
|
41833
|
+
};
|
|
41834
|
+
const flushParagraph = () => {
|
|
41835
|
+
const text = paragraph.join(' ').replace(/\s+/g, ' ').trim();
|
|
41836
|
+
paragraph.length = 0;
|
|
41837
|
+
if (text)
|
|
41838
|
+
pushText(text);
|
|
41839
|
+
};
|
|
41645
41840
|
for (const line of lines) {
|
|
41646
41841
|
const label = parseVerificationLabel(line);
|
|
41647
41842
|
if (label) {
|
|
41843
|
+
// Flush before switching buckets so the paragraph lands under the label it was
|
|
41844
|
+
// written beneath, not the next one.
|
|
41845
|
+
flushParagraph();
|
|
41846
|
+
last.append = null;
|
|
41648
41847
|
sawLabel = true;
|
|
41649
41848
|
const kind = VERIFICATION_LABEL_TO_KIND[label.toLowerCase()];
|
|
41650
41849
|
if (kind) {
|
|
@@ -41665,31 +41864,41 @@ function extractVerification(sections) {
|
|
|
41665
41864
|
currentLegacy = null;
|
|
41666
41865
|
continue;
|
|
41667
41866
|
}
|
|
41668
|
-
if (!
|
|
41867
|
+
if (!line.trim()) {
|
|
41868
|
+
flushParagraph();
|
|
41869
|
+
last.append = null;
|
|
41669
41870
|
continue;
|
|
41670
|
-
|
|
41671
|
-
|
|
41871
|
+
}
|
|
41872
|
+
// Structure first, so a `### Regression checks` subheading under `## Verification` can
|
|
41873
|
+
// neither become a check of its own nor be folded into the check above it. It used to
|
|
41874
|
+
// become one, and a Verification section holding nothing but subheadings passed.
|
|
41875
|
+
if (isNotContent(line)) {
|
|
41876
|
+
flushParagraph();
|
|
41877
|
+
last.append = null;
|
|
41672
41878
|
continue;
|
|
41673
|
-
|
|
41674
|
-
|
|
41675
|
-
|
|
41879
|
+
}
|
|
41880
|
+
if (isListItem(line)) {
|
|
41881
|
+
flushParagraph();
|
|
41882
|
+
const text = stripListMarker(line);
|
|
41883
|
+
if (!text) {
|
|
41884
|
+
last.append = null;
|
|
41676
41885
|
continue;
|
|
41677
|
-
|
|
41678
|
-
|
|
41679
|
-
|
|
41680
|
-
if (verifies)
|
|
41681
|
-
check.verifies = verifies;
|
|
41682
|
-
(result.checks ||= []).push(check);
|
|
41886
|
+
}
|
|
41887
|
+
pushText(text);
|
|
41888
|
+
continue;
|
|
41683
41889
|
}
|
|
41684
|
-
|
|
41685
|
-
|
|
41890
|
+
// Lazy continuation, as above: a wrapped check is one check.
|
|
41891
|
+
if (last.append) {
|
|
41892
|
+
last.append(line.trim());
|
|
41893
|
+
continue;
|
|
41686
41894
|
}
|
|
41687
|
-
|
|
41688
|
-
|
|
41689
|
-
|
|
41690
|
-
(result.manualChecks ||= []).push(text);
|
|
41895
|
+
if (!includeProse) {
|
|
41896
|
+
flushParagraph();
|
|
41897
|
+
continue;
|
|
41691
41898
|
}
|
|
41899
|
+
paragraph.push(line.trim());
|
|
41692
41900
|
}
|
|
41901
|
+
flushParagraph();
|
|
41693
41902
|
return result;
|
|
41694
41903
|
}
|
|
41695
41904
|
function hasVerificationContent(v) {
|
|
@@ -42684,7 +42893,7 @@ async function pushSpec(input) {
|
|
|
42684
42893
|
* https://preflight.pathmode.io, so keep it true.
|
|
42685
42894
|
*/
|
|
42686
42895
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
42687
|
-
exports.READINESS_GATE_ORDER = exports.READINESS_BLOCKER_DESCRIPTIONS = void 0;
|
|
42896
|
+
exports.READINESS_GATE_ORDER = exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER = exports.READINESS_BLOCKER_DESCRIPTIONS = void 0;
|
|
42688
42897
|
exports.coerceText = coerceText;
|
|
42689
42898
|
exports.asArray = asArray;
|
|
42690
42899
|
exports.isTitleMeaningful = isTitleMeaningful;
|
|
@@ -42692,6 +42901,7 @@ exports.isConstraintConcrete = isConstraintConcrete;
|
|
|
42692
42901
|
exports.isVerificationCheckSubstantive = isVerificationCheckSubstantive;
|
|
42693
42902
|
exports.isObjectiveSpecific = isObjectiveSpecific;
|
|
42694
42903
|
exports.isOutcomeMeasurable = isOutcomeMeasurable;
|
|
42904
|
+
exports.readinessBlockerFor = readinessBlockerFor;
|
|
42695
42905
|
exports.normalizeAnchor = normalizeAnchor;
|
|
42696
42906
|
exports.fieldDigest = fieldDigest;
|
|
42697
42907
|
exports.computeReadinessVerdict = computeReadinessVerdict;
|
|
@@ -42811,6 +43021,18 @@ exports.READINESS_BLOCKER_DESCRIPTIONS = {
|
|
|
42811
43021
|
edgeCases: 'No edge case with a defined expected behavior.',
|
|
42812
43022
|
verification: 'No concrete verification — describe at least one check specific enough to run.',
|
|
42813
43023
|
};
|
|
43024
|
+
/**
|
|
43025
|
+
* MIRROR of `OUTCOMES_TOO_FEW_BLOCKER` in lib/intentReadiness.ts; see its comment for why the
|
|
43026
|
+
* outcomes gate needs two messages. The threshold is unchanged.
|
|
43027
|
+
*/
|
|
43028
|
+
exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER = 'Fewer than two outcomes. Name at least two, one per line or paragraph, so each can be checked on its own.';
|
|
43029
|
+
function readinessBlockerFor(key, spec) {
|
|
43030
|
+
if (key !== 'outcomes')
|
|
43031
|
+
return exports.READINESS_BLOCKER_DESCRIPTIONS[key];
|
|
43032
|
+
return asArray(spec.outcomes).map(o => outcomeText(o).trim()).filter(Boolean).length < 2
|
|
43033
|
+
? exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER
|
|
43034
|
+
: exports.READINESS_BLOCKER_DESCRIPTIONS.outcomes;
|
|
43035
|
+
}
|
|
42814
43036
|
/** Display order for the gate strip (title first, matching the Preflight page). */
|
|
42815
43037
|
// ── Confirmation anchoring ──────────────────────────────────────────────────
|
|
42816
43038
|
/**
|
|
@@ -42990,7 +43212,7 @@ function computeReadinessVerdict(spec) {
|
|
|
42990
43212
|
};
|
|
42991
43213
|
const failingBlockers = BLOCKER_ORDER
|
|
42992
43214
|
.filter(k => !signals[k])
|
|
42993
|
-
.map(k =>
|
|
43215
|
+
.map(k => readinessBlockerFor(k, spec));
|
|
42994
43216
|
// What the reader read, per dimension, independent of whether the heuristic accepted it.
|
|
42995
43217
|
// Placeholder text is deliberately not extracted: no path from a blank spec to confirmable.
|
|
42996
43218
|
const objectiveText = coerceText(spec.objective).trim();
|
|
@@ -43008,11 +43230,14 @@ function computeReadinessVerdict(spec) {
|
|
|
43008
43230
|
const detail = {};
|
|
43009
43231
|
for (const key of exports.READINESS_GATE_ORDER) {
|
|
43010
43232
|
const text = extractedBy[key] ?? '';
|
|
43233
|
+
// Only when it OVERRIDES the static message, so the common shape is untouched.
|
|
43234
|
+
const resolved = readinessBlockerFor(key, spec);
|
|
43235
|
+
const override = resolved && resolved !== exports.READINESS_BLOCKER_DESCRIPTIONS[key] ? { blocker: resolved } : {};
|
|
43011
43236
|
detail[key] = signals[key]
|
|
43012
43237
|
? { state: 'pass', ...(text ? { extracted: text } : {}) }
|
|
43013
43238
|
: text
|
|
43014
|
-
? { state: 'unconfirmed', extracted: text }
|
|
43015
|
-
: { state: 'absent' };
|
|
43239
|
+
? { state: 'unconfirmed', extracted: text, ...override }
|
|
43240
|
+
: { state: 'absent', ...override };
|
|
43016
43241
|
}
|
|
43017
43242
|
// Confirmations only ever move a dimension the heuristics already failed; `signals` is never
|
|
43018
43243
|
// mutated, so the lexical verdict stays visible underneath.
|
|
@@ -43070,15 +43295,36 @@ function formatReadinessFrontmatter(verdict) {
|
|
|
43070
43295
|
* The extra line an `unconfirmed` dimension earns: what was read, and an honest statement of
|
|
43071
43296
|
* what the check could not find in it.
|
|
43072
43297
|
*
|
|
43073
|
-
*
|
|
43074
|
-
* audit measured that most failures on those two are false negatives from a fixed English
|
|
43075
|
-
* vocabulary
|
|
43076
|
-
*
|
|
43298
|
+
* Objective and outcomes get the SOFTENED copy, and that scoping is the finding, not caution:
|
|
43299
|
+
* the audit measured that most failures on those two are false negatives from a fixed English
|
|
43300
|
+
* vocabulary, so telling those authors the text may be fine is honest.
|
|
43301
|
+
*
|
|
43302
|
+
* Constraints, edge cases and verification get a hint too, but a plainer one. Their measured
|
|
43303
|
+
* misses were extraction failures, and the audit never measured their lexical recall, so the
|
|
43304
|
+
* copy states what was read and what is missing from it and stops there. It does not say the
|
|
43305
|
+
* check is probably wrong, because for these three there is no evidence that it is. They earn
|
|
43306
|
+
* a hint at all only because the parser now preserves prose: before that, an unread section
|
|
43307
|
+
* reached this code as `absent`, there was nothing extracted to quote, and the reader was told
|
|
43308
|
+
* it had written nothing.
|
|
43077
43309
|
*/
|
|
43078
43310
|
const UNCONFIRMED_HINT = {
|
|
43079
43311
|
objective: 'Read this, but could not confirm an affected actor and a concrete problem in it. If it already names them, this check reads a fixed vocabulary and may be missing valid phrasing:',
|
|
43080
43312
|
outcomes: 'Read these, but could not confirm an observable threshold in enough of them. If they are already observable, this check reads a fixed vocabulary and may be missing valid phrasing:',
|
|
43313
|
+
constraints: 'Read this, but could not confirm a hard limit in it. A constraint names something that must never happen:',
|
|
43314
|
+
edgeCases: 'Read this, but no expected behavior was paired with it. Write the case as "situation: what should happen", one per line or paragraph:',
|
|
43315
|
+
verification: 'Read this, but could not confirm a check specific enough to run. A check names a command or a stated expected result:',
|
|
43081
43316
|
};
|
|
43317
|
+
/**
|
|
43318
|
+
* The hint has to follow the blocker that was actually chosen. When outcomes failed on COUNT,
|
|
43319
|
+
* the measurability hint contradicted the line directly above it and accused wording the
|
|
43320
|
+
* detector had accepted.
|
|
43321
|
+
*/
|
|
43322
|
+
function unconfirmedHintFor(key, d) {
|
|
43323
|
+
if (key === 'outcomes' && d?.blocker === exports.READINESS_OUTCOMES_TOO_FEW_BLOCKER) {
|
|
43324
|
+
return 'Read this. If it holds more than one outcome, separate them so each can be checked on its own:';
|
|
43325
|
+
}
|
|
43326
|
+
return UNCONFIRMED_HINT[key];
|
|
43327
|
+
}
|
|
43082
43328
|
/** Keep a quoted extraction to one readable line; the full text is in verdict.detail. */
|
|
43083
43329
|
function truncateForQuote(text, max = 160) {
|
|
43084
43330
|
const flat = text.replace(/\s+/g, ' ').trim();
|
|
@@ -43130,10 +43376,11 @@ repairHint) {
|
|
|
43130
43376
|
for (const key of BLOCKER_ORDER) {
|
|
43131
43377
|
if (verdict.signals[key] || resolved(key) === 'pass' || resolved(key) === 'not_applicable')
|
|
43132
43378
|
continue;
|
|
43133
|
-
lines.push(` ✗ ${exports.READINESS_BLOCKER_DESCRIPTIONS[key]}`);
|
|
43379
|
+
lines.push(` ✗ ${verdict.detail?.[key]?.blocker ?? exports.READINESS_BLOCKER_DESCRIPTIONS[key]}`);
|
|
43134
43380
|
const d = verdict.detail?.[key];
|
|
43135
|
-
|
|
43136
|
-
|
|
43381
|
+
const hint = unconfirmedHintFor(key, d);
|
|
43382
|
+
if (d?.state === 'unconfirmed' && d.extracted && hint) {
|
|
43383
|
+
lines.push(` ↳ ${hint}`);
|
|
43137
43384
|
lines.push(` "${truncateForQuote(d.extracted)}"`);
|
|
43138
43385
|
}
|
|
43139
43386
|
}
|
|
@@ -72903,7 +73150,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"$schema":"http://json-schema.org/dra
|
|
|
72903
73150
|
/***/ ((module) => {
|
|
72904
73151
|
|
|
72905
73152
|
"use strict";
|
|
72906
|
-
module.exports = /*#__PURE__*/JSON.parse('{"name":"@pathmode/mcp-server","version":"1.
|
|
73153
|
+
module.exports = /*#__PURE__*/JSON.parse('{"name":"@pathmode/mcp-server","version":"1.27.0","publishConfig":{"access":"public"},"mcpName":"io.github.pathmodeio/mcp-server","description":"Deterministic intent preflight before your agent builds: six calibrated gates, keyless, no model call. Draft and sharpen specs in conversation, or connect a Pathmode workspace to sync intent and evidence across a team.","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"},"homepage":"https://pathmode.io","dependencies":{"@modelcontextprotocol/sdk":"^1.12.1","gray-matter":"^4.0.3","zod":"^3.24.0"},"overrides":{"@hono/node-server":"^1.19.17","body-parser":"^2.3.0","fast-uri":"^3.1.6","hono":"^4.13.5","ip-address":"^10.7.0","js-yaml":"^3.15.2"},"devDependencies":{"@types/node":"^25.1.0","@vercel/ncc":"^0.38.4","ts-node":"^10.9.2","typescript":"^5.9.3"}}');
|
|
72907
73154
|
|
|
72908
73155
|
/***/ })
|
|
72909
73156
|
|
|
@@ -184,5 +184,25 @@ export declare function renderAuthorizationGateText(opts: {
|
|
|
184
184
|
* so an unwaivable dimension never leaves an empty section behind.
|
|
185
185
|
*/
|
|
186
186
|
export declare function renderConfirmationsBody(records: SerializableConfirmation[] | undefined): string;
|
|
187
|
+
/**
|
|
188
|
+
* Captions this codebase writes into an intent.md, as opposed to anything an author wrote.
|
|
189
|
+
*
|
|
190
|
+
* A caption is prose under a heading that is NOT content: it explains the section rather than
|
|
191
|
+
* recording a decision. The readers exclude exactly these strings, which is why they live here,
|
|
192
|
+
* next to the code that emits them, and are imported rather than retyped. Excluding "all italic
|
|
193
|
+
* prose" instead was wrong: an author writing `*Must not slow down page load.*` under
|
|
194
|
+
* Constraints means it, and reporting that section as absent is the accusation the four-state
|
|
195
|
+
* gate exists to stop making.
|
|
196
|
+
*
|
|
197
|
+
* Adding a caption anywhere means adding it here, or the reader will grade it as content.
|
|
198
|
+
*/
|
|
199
|
+
export declare const VERIFICATION_FEEDBACK_CAPTION = "_A feedback loop, not just a test list._";
|
|
200
|
+
/** Written by lib/scan/draftIntentMd.ts when a pre-account draft has no verification yet. */
|
|
201
|
+
export declare const VERIFICATION_NOT_DEFINED_CAPTION = "_Not defined yet. Nothing in this spec has been checked against a running system._";
|
|
202
|
+
export declare const GENERATED_CAPTIONS: readonly string[];
|
|
203
|
+
/** Trim, drop one layer of surrounding `_` or `*`, casefold. Both emphasis spellings match. */
|
|
204
|
+
export declare function normalizeCaption(line: string): string;
|
|
205
|
+
/** True only for a caption this codebase generated. Author prose, italic or not, is content. */
|
|
206
|
+
export declare function isGeneratedCaption(line: string): boolean;
|
|
187
207
|
export declare function serializeIntentMd(spec: SerializableIntent, opts?: SerializeIntentMdOptions): string;
|
|
188
208
|
//# sourceMappingURL=serializeIntentMd.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializeIntentMd.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/intentspec-format/serializeIntentMd.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serializeIntentMd.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/intentspec-format/serializeIntentMd.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-reader.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/local-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"local-reader.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/local-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,12 @@ export declare function isVerificationCheckSubstantive(description: string | nul
|
|
|
20
20
|
export declare function isObjectiveSpecific(objective: string | null | undefined): boolean;
|
|
21
21
|
export declare function isOutcomeMeasurable(text: string): boolean;
|
|
22
22
|
export declare const READINESS_BLOCKER_DESCRIPTIONS: Record<string, string>;
|
|
23
|
+
/**
|
|
24
|
+
* MIRROR of `OUTCOMES_TOO_FEW_BLOCKER` in lib/intentReadiness.ts; see its comment for why the
|
|
25
|
+
* outcomes gate needs two messages. The threshold is unchanged.
|
|
26
|
+
*/
|
|
27
|
+
export declare const READINESS_OUTCOMES_TOO_FEW_BLOCKER = "Fewer than two outcomes. Name at least two, one per line or paragraph, so each can be checked on its own.";
|
|
28
|
+
export declare function readinessBlockerFor(key: string, spec: ReadinessSpecInput): string;
|
|
23
29
|
/**
|
|
24
30
|
* Fold away everything that is a rewrite of the same claim, and nothing that is a change to it.
|
|
25
31
|
* NFC because one glyph has two encodings; soft hyphens because editors inject them invisibly;
|
|
@@ -86,6 +92,12 @@ export interface DimensionDetail {
|
|
|
86
92
|
state: DimensionState;
|
|
87
93
|
/** What the reader actually read for this dimension, for quoting back. */
|
|
88
94
|
extracted?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Set ONLY when this failure's message overrides the static one. MIRROR of
|
|
97
|
+
* `DimensionDetail.blocker` in lib/intentReadiness.ts: outcomes fails either on count or on
|
|
98
|
+
* measurability, and `formatReadinessVerdict` never receives the spec.
|
|
99
|
+
*/
|
|
100
|
+
blocker?: string;
|
|
89
101
|
/** Set when a confirmation or waiver moved this dimension: who vouched, and how well we know it. */
|
|
90
102
|
confirmedBy?: 'agent' | 'human';
|
|
91
103
|
assurance?: 'authenticated' | 'local-unverified';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readiness.d.ts","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;
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["file:///Users/jannelammi/code/Pathmode/packages/mcp-server/src/readiness.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"manifest_version": "0.3",
|
|
3
3
|
"name": "pathmode",
|
|
4
4
|
"display_name": "Pathmode",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.27.0",
|
|
6
6
|
"description": "Deterministic preflight for the intent you hand to a coding agent: six calibrated gates, the exact blockers named, no model call, no key needed.",
|
|
7
7
|
"long_description": "Pathmode MCP Server runs a deterministic preflight before your coding agent builds: check_intent_readiness scores an intent spec against six calibrated gates (title, objective, outcomes, constraints, edge cases, verification) and names the exact blockers, with no model call and no account. Keyless local mode works out of the box; specs live in intent.md in your repo, plain markdown you own, and skills for drafting, pressure-testing, and handing off intent ride along. Connect a Pathmode workspace with an API key to sync intent and evidence across a team, analyze dependency graphs, and verify pull requests against the outcomes you agreed to.",
|
|
8
8
|
"author": {
|