@formspec/analysis 0.1.0-alpha.20 → 0.1.0-alpha.21

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tag-registry.ts","../src/semantic-protocol.ts","../src/workspace-runtime.ts"],"sourcesContent":["import {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n type BuiltinConstraintName,\n} from \"@formspec/core\";\n\nexport type FormSpecValueKind =\n | \"number\"\n | \"integer\"\n | \"signedInteger\"\n | \"string\"\n | \"json\"\n | \"boolean\"\n | \"condition\";\n\nexport type FormSpecTargetKind = \"none\" | \"path\" | \"member\" | \"variant\";\nexport type FormSpecTagCategory = \"constraint\" | \"annotation\" | \"structure\" | \"ecosystem\";\n\nexport type FormSpecPlacement =\n | \"class\"\n | \"class-field\"\n | \"class-method\"\n | \"interface\"\n | \"interface-field\"\n | \"type-alias\"\n | \"type-alias-field\"\n | \"variable\"\n | \"function\"\n | \"function-parameter\"\n | \"method-parameter\";\n\nexport type SemanticCapability =\n | \"numeric-comparable\"\n | \"string-like\"\n | \"array-like\"\n | \"enum-member-addressable\"\n | \"json-like\"\n | \"condition-like\"\n | \"object-like\";\n\nexport interface TagSignatureParameter {\n readonly kind: \"value\" | \"target-path\" | \"target-member\" | \"target-variant\";\n readonly label: string;\n readonly optional?: boolean;\n readonly capability?: SemanticCapability;\n readonly valueKind?: FormSpecValueKind;\n}\n\nexport interface TagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n readonly parameters: readonly TagSignatureParameter[];\n}\n\nexport interface TagDefinition {\n readonly canonicalName: string;\n readonly valueKind: FormSpecValueKind | null;\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly capabilities: readonly SemanticCapability[];\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n readonly signatures: readonly TagSignature[];\n}\n\nexport type FormSpecTagDefinition = TagDefinition;\nexport type FormSpecTagOverload = TagSignature;\nexport type FormSpecTagParameter = TagSignatureParameter;\n\nexport interface ExtensionConstraintTagSource {\n readonly tagName: string;\n}\n\nexport interface ExtensionTagSource {\n readonly extensionId: string;\n readonly constraintTags?: readonly ExtensionConstraintTagSource[];\n}\n\nexport const FORM_SPEC_PLACEMENTS = [\n \"class\",\n \"class-field\",\n \"class-method\",\n \"interface\",\n \"interface-field\",\n \"type-alias\",\n \"type-alias-field\",\n \"variable\",\n \"function\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nexport const FORM_SPEC_TARGET_KINDS = [\n \"none\",\n \"path\",\n \"member\",\n \"variant\",\n] as const satisfies readonly FormSpecTargetKind[];\n\nconst FIELD_PLACEMENTS = [\n \"class-field\",\n \"interface-field\",\n \"type-alias-field\",\n \"variable\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst TYPE_PLACEMENTS = [\n \"class\",\n \"interface\",\n \"type-alias\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst DECLARATION_PLACEMENTS = [\n \"class-method\",\n \"function\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst ALL_PLACEMENTS = [\n ...TYPE_PLACEMENTS,\n ...FIELD_PLACEMENTS,\n ...DECLARATION_PLACEMENTS,\n] as const satisfies readonly FormSpecPlacement[];\n\nconst INTEGER_VALUE_TAGS = new Set([\"minLength\", \"maxLength\", \"minItems\", \"maxItems\"]);\nconst SIGNED_INTEGER_VALUE_TAGS = new Set([\"order\"]);\nconst JSON_VALUE_TAGS = new Set([\"const\", \"enumOptions\"]);\nconst BOOLEAN_VALUE_TAGS = new Set([\"uniqueItems\"]);\nconst STRING_VALUE_TAGS = new Set([\n \"pattern\",\n \"displayName\",\n \"description\",\n \"format\",\n \"placeholder\",\n \"group\",\n \"example\",\n \"remarks\",\n \"see\",\n \"apiName\",\n]);\nconst CONDITION_VALUE_TAGS = new Set([\"showWhen\", \"hideWhen\", \"enableWhen\", \"disableWhen\"]);\n\nconst CONSTRAINT_COMPLETION_DETAIL: Record<string, string> = {\n minimum: \"Minimum numeric value (inclusive). Example: `@minimum 0`\",\n maximum: \"Maximum numeric value (inclusive). Example: `@maximum 100`\",\n exclusiveMinimum: \"Minimum numeric value (exclusive). Example: `@exclusiveMinimum 0`\",\n exclusiveMaximum: \"Maximum numeric value (exclusive). Example: `@exclusiveMaximum 100`\",\n multipleOf: \"Value must be a multiple of this number. Example: `@multipleOf 0.01`\",\n minLength: \"Minimum string length. Example: `@minLength 1`\",\n maxLength: \"Maximum string length. Example: `@maxLength 255`\",\n minItems: \"Minimum number of array items. Example: `@minItems 1`\",\n maxItems: \"Maximum number of array items. Example: `@maxItems 10`\",\n uniqueItems: \"Require all array items to be distinct. Example: `@uniqueItems`\",\n pattern: \"Regular expression pattern for string validation. Example: `@pattern ^[a-z]+$`\",\n enumOptions: 'Inline JSON array of allowed enum values. Example: `@enumOptions [\"a\",\"b\",\"c\"]`',\n const: 'Require a constant JSON value. Example: `@const \"USD\"`',\n};\n\nconst CONSTRAINT_HOVER_DOCS: Record<string, string> = {\n minimum: [\n \"**@minimum** `<number>`\",\n \"\",\n \"Sets an inclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `minimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minimum [:path] <number>`\",\n ].join(\"\\n\"),\n maximum: [\n \"**@maximum** `<number>`\",\n \"\",\n \"Sets an inclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `maximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maximum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMinimum: [\n \"**@exclusiveMinimum** `<number>`\",\n \"\",\n \"Sets an exclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMinimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMinimum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMaximum: [\n \"**@exclusiveMaximum** `<number>`\",\n \"\",\n \"Sets an exclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMaximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMaximum [:path] <number>`\",\n ].join(\"\\n\"),\n multipleOf: [\n \"**@multipleOf** `<number>`\",\n \"\",\n \"Requires the numeric value to be a multiple of the given number.\",\n \"\",\n \"Maps to `multipleOf` in JSON Schema.\",\n \"\",\n \"**Signature:** `@multipleOf [:path] <number>`\",\n ].join(\"\\n\"),\n minLength: [\n \"**@minLength** `<integer>`\",\n \"\",\n \"Sets a minimum character length on a string field.\",\n \"\",\n \"Maps to `minLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minLength [:path] <integer>`\",\n ].join(\"\\n\"),\n maxLength: [\n \"**@maxLength** `<integer>`\",\n \"\",\n \"Sets a maximum character length on a string field.\",\n \"\",\n \"Maps to `maxLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxLength [:path] <integer>`\",\n ].join(\"\\n\"),\n minItems: [\n \"**@minItems** `<integer>`\",\n \"\",\n \"Sets a minimum number of items in an array field.\",\n \"\",\n \"Maps to `minItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minItems [:path] <integer>`\",\n ].join(\"\\n\"),\n maxItems: [\n \"**@maxItems** `<integer>`\",\n \"\",\n \"Sets a maximum number of items in an array field.\",\n \"\",\n \"Maps to `maxItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxItems [:path] <integer>`\",\n ].join(\"\\n\"),\n uniqueItems: [\n \"**@uniqueItems**\",\n \"\",\n \"Requires all items in an array field to be distinct.\",\n \"\",\n \"Maps to `uniqueItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@uniqueItems [:path]`\",\n ].join(\"\\n\"),\n pattern: [\n \"**@pattern** `<regex>`\",\n \"\",\n \"Sets a regular expression pattern that a string field must match.\",\n \"\",\n \"Maps to `pattern` in JSON Schema.\",\n \"\",\n \"**Signature:** `@pattern [:path] <regex>`\",\n ].join(\"\\n\"),\n enumOptions: [\n \"**@enumOptions** `<json-array>`\",\n \"\",\n \"Specifies the allowed values for an enum field as an inline JSON array.\",\n \"\",\n \"Maps to `enum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@enumOptions <json-array>`\",\n ].join(\"\\n\"),\n const: [\n \"**@const** `<json-literal>`\",\n \"\",\n \"Requires the field value to equal a single constant JSON value.\",\n \"\",\n \"Maps to `const` in JSON Schema.\",\n \"\",\n \"**Signature:** `@const [:path] <json-literal>`\",\n ].join(\"\\n\"),\n};\n\ntype SupportedSignatureTarget = Exclude<FormSpecTargetKind, \"none\">;\n\ninterface ExtraTagSpec {\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly completionDetail: string;\n readonly hoverSummary: string;\n readonly valueKind?: FormSpecValueKind | null;\n readonly valueLabel?: string;\n readonly targetPlacements?: Partial<\n Record<SupportedSignatureTarget, readonly FormSpecPlacement[]>\n >;\n}\n\nfunction inferValueKind(name: string): FormSpecValueKind | null {\n if (INTEGER_VALUE_TAGS.has(name)) return \"integer\";\n if (SIGNED_INTEGER_VALUE_TAGS.has(name)) return \"signedInteger\";\n if (JSON_VALUE_TAGS.has(name)) return \"json\";\n if (BOOLEAN_VALUE_TAGS.has(name)) return \"boolean\";\n if (STRING_VALUE_TAGS.has(name)) return \"string\";\n if (CONDITION_VALUE_TAGS.has(name)) return \"condition\";\n return null;\n}\n\nfunction getBuiltinValueKind(name: BuiltinConstraintName): FormSpecValueKind {\n return inferValueKind(name) ?? \"number\";\n}\n\nfunction getBuiltinConstraintCapability(name: BuiltinConstraintName): SemanticCapability {\n switch (name) {\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"multipleOf\":\n return \"numeric-comparable\";\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n return \"string-like\";\n case \"minItems\":\n case \"maxItems\":\n case \"uniqueItems\":\n return \"array-like\";\n case \"enumOptions\":\n return \"enum-member-addressable\";\n case \"const\":\n return \"json-like\";\n default: {\n const exhaustive: never = name;\n return exhaustive;\n }\n }\n}\n\nfunction capabilitiesForValueKind(\n valueKind: FormSpecValueKind | null\n): readonly SemanticCapability[] {\n switch (valueKind) {\n case \"number\":\n case \"integer\":\n case \"signedInteger\":\n return [\"numeric-comparable\"];\n case \"string\":\n return [\"string-like\"];\n case \"json\":\n return [\"json-like\"];\n case \"condition\":\n return [\"condition-like\"];\n case \"boolean\":\n case null:\n return [];\n default: {\n const exhaustive: never = valueKind;\n return exhaustive;\n }\n }\n}\n\nfunction valueLabelForKind(valueKind: FormSpecValueKind | null, fallback = \"<value>\"): string {\n switch (valueKind) {\n case \"number\":\n return \"<number>\";\n case \"integer\":\n case \"signedInteger\":\n return \"<integer>\";\n case \"string\":\n return \"<text>\";\n case \"json\":\n return \"<json>\";\n case \"condition\":\n return \"<condition>\";\n case \"boolean\":\n case null:\n return \"\";\n default: {\n const exhaustive: never = valueKind;\n void exhaustive;\n return fallback;\n }\n }\n}\n\nfunction targetLabelForKind(kind: SupportedSignatureTarget): string {\n switch (kind) {\n case \"path\":\n return \"[:path]\";\n case \"member\":\n return \":member\";\n case \"variant\":\n return \":variant\";\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction parameterKindForTarget(\n targetKind: SupportedSignatureTarget\n): TagSignatureParameter[\"kind\"] {\n switch (targetKind) {\n case \"path\":\n return \"target-path\";\n case \"member\":\n return \"target-member\";\n case \"variant\":\n return \"target-variant\";\n default: {\n const exhaustive: never = targetKind;\n return exhaustive;\n }\n }\n}\n\nfunction createTargetParameter(\n targetKind: SupportedSignatureTarget,\n valueKind: FormSpecValueKind | null,\n pathCapability?: SemanticCapability\n): TagSignatureParameter {\n const base: TagSignatureParameter = {\n kind: parameterKindForTarget(targetKind),\n label: targetLabelForKind(targetKind),\n optional: targetKind === \"path\",\n };\n\n if (targetKind === \"path\") {\n const capability = pathCapability ?? capabilitiesForValueKind(valueKind)[0];\n return capability === undefined ? base : { ...base, capability };\n }\n\n if (targetKind === \"member\") {\n return { ...base, capability: \"enum-member-addressable\" };\n }\n\n return base;\n}\n\nfunction createSignature(\n name: string,\n placements: readonly FormSpecPlacement[],\n targetKind: SupportedSignatureTarget | null,\n valueKind: FormSpecValueKind | null,\n valueLabel: string,\n pathCapability?: SemanticCapability\n): TagSignature {\n const parameters: TagSignatureParameter[] = [];\n\n if (targetKind !== null) {\n parameters.push(createTargetParameter(targetKind, valueKind, pathCapability));\n }\n if (valueLabel !== \"\") {\n parameters.push(\n valueKind === null\n ? {\n kind: \"value\",\n label: valueLabel,\n }\n : {\n kind: \"value\",\n label: valueLabel,\n valueKind,\n }\n );\n }\n\n const targetLabel = targetKind === null ? \"\" : ` ${targetLabelForKind(targetKind)}`;\n const valueLabelSuffix = valueLabel === \"\" ? \"\" : ` ${valueLabel}`;\n\n return {\n label: `@${name}${targetLabel}${valueLabelSuffix}`,\n placements,\n parameters,\n };\n}\n\nfunction buildHoverMarkdown(\n name: string,\n hoverSummary: string,\n signatures: readonly TagSignature[],\n valueLabel: string\n): string {\n const header = valueLabel === \"\" ? `**@${name}**` : `**@${name}** \\`${valueLabel}\\``;\n const signatureLines =\n signatures.length === 1\n ? [`**Signature:** \\`${signatures[0]?.label ?? `@${name}`}\\``]\n : [\"**Signatures:**\", ...signatures.map((signature) => `- \\`${signature.label}\\``)];\n\n return [header, \"\", hoverSummary, \"\", ...signatureLines].join(\"\\n\");\n}\n\nfunction makeConstraintSignatures(name: BuiltinConstraintName): readonly TagSignature[] {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n const valueLabel =\n name === \"pattern\"\n ? \"<regex>\"\n : name === \"enumOptions\"\n ? \"<json-array>\"\n : name === \"const\"\n ? \"<json-literal>\"\n : valueLabelForKind(valueKind);\n\n return [\n createSignature(name, FIELD_PLACEMENTS, null, valueKind, valueLabel),\n createSignature(name, FIELD_PLACEMENTS, \"path\", valueKind, valueLabel, subjectCapability),\n ];\n}\n\nconst BUILTIN_TAG_DEFINITIONS = Object.fromEntries(\n (Object.keys(BUILTIN_CONSTRAINT_DEFINITIONS) as BuiltinConstraintName[]).map((name) => {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n return [\n name,\n {\n canonicalName: name,\n valueKind,\n requiresArgument: valueKind !== \"boolean\",\n supportedTargets: [\"none\", \"path\"] as const,\n allowDuplicates: false,\n category: \"constraint\" as const,\n placements: FIELD_PLACEMENTS,\n capabilities: [subjectCapability],\n completionDetail: CONSTRAINT_COMPLETION_DETAIL[name] ?? `@${name}`,\n hoverMarkdown: CONSTRAINT_HOVER_DOCS[name] ?? `**@${name}**`,\n signatures: makeConstraintSignatures(name),\n } satisfies TagDefinition,\n ];\n })\n) as Record<string, TagDefinition>;\n\nconst EXTRA_TAG_SPECS = {\n displayName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Display label for a type, field, or enum member.\",\n hoverSummary: \"Provides a user-facing display label.\",\n valueLabel: \"<label>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n description: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Description text for a type or field.\",\n hoverSummary: \"Provides descriptive documentation for a type or field.\",\n },\n format: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Format hint for a field.\",\n hoverSummary: \"Provides a format hint for a field.\",\n valueLabel: \"<format>\",\n },\n placeholder: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Placeholder text for a field.\",\n hoverSummary: \"Provides placeholder text for a field.\",\n },\n order: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Field display order hint.\",\n hoverSummary: \"Provides an integer ordering hint for UI layout.\",\n },\n apiName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"API-facing serialized name for a type, field, or variant.\",\n hoverSummary: \"Overrides the serialized API name used in generated schema output.\",\n valueLabel: \"<identifier>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n group: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Assigns a field to a UI group.\",\n hoverSummary: \"Assigns the field to a named grouping container.\",\n valueLabel: \"<group>\",\n },\n showWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility rule.\",\n hoverSummary: \"Shows the field only when the condition is satisfied.\",\n },\n hideWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility suppression rule.\",\n hoverSummary: \"Hides the field when the condition is satisfied.\",\n },\n enableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional interactivity rule.\",\n hoverSummary: \"Enables the field only when the condition is satisfied.\",\n },\n disableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional disablement rule.\",\n hoverSummary: \"Disables the field when the condition is satisfied.\",\n },\n defaultValue: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Default JSON value for a field.\",\n hoverSummary: \"Provides a default JSON value for ecosystem integrations.\",\n valueLabel: \"<value>\",\n },\n deprecated: {\n requiresArgument: false,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Marks a declaration as deprecated.\",\n hoverSummary: \"Marks the declaration as deprecated.\",\n },\n example: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Example serialized value.\",\n hoverSummary: \"Provides an example value for documentation and tooling.\",\n },\n remarks: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Additional remarks text.\",\n hoverSummary: \"Provides additional remarks for the declaration.\",\n },\n see: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Reference to related documentation.\",\n hoverSummary: \"References related documentation or declarations.\",\n valueLabel: \"<reference>\",\n },\n} as const satisfies Record<string, ExtraTagSpec>;\n\nfunction buildExtraTagDefinition(canonicalName: string, spec: ExtraTagSpec): TagDefinition {\n const valueKind = spec.valueKind ?? inferValueKind(canonicalName);\n const valueLabel = spec.requiresArgument ? (spec.valueLabel ?? valueLabelForKind(valueKind)) : \"\";\n const signatures: TagSignature[] = [];\n\n if (spec.supportedTargets.includes(\"none\")) {\n signatures.push(createSignature(canonicalName, spec.placements, null, valueKind, valueLabel));\n }\n if (spec.supportedTargets.includes(\"path\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.path ?? spec.placements,\n \"path\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"member\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.member ?? spec.placements,\n \"member\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"variant\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.variant ?? spec.placements,\n \"variant\",\n valueKind,\n valueLabel\n )\n );\n }\n\n return {\n canonicalName,\n valueKind,\n requiresArgument: spec.requiresArgument,\n supportedTargets: spec.supportedTargets,\n allowDuplicates: spec.allowDuplicates,\n category: spec.category,\n placements: spec.placements,\n capabilities: capabilitiesForValueKind(valueKind),\n completionDetail: spec.completionDetail,\n hoverMarkdown: buildHoverMarkdown(canonicalName, spec.hoverSummary, signatures, valueLabel),\n signatures,\n };\n}\n\nconst EXTRA_TAG_DEFINITIONS: Record<string, TagDefinition> = Object.fromEntries(\n Object.entries(EXTRA_TAG_SPECS).map(([canonicalName, spec]) => [\n canonicalName,\n buildExtraTagDefinition(canonicalName, spec),\n ])\n);\n\nexport function normalizeFormSpecTagName(rawName: string): string {\n return normalizeConstraintTagName(rawName);\n}\n\nexport function getTagDefinition(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): TagDefinition | null {\n const normalized = normalizeFormSpecTagName(rawName);\n const builtin = BUILTIN_TAG_DEFINITIONS[normalized];\n if (builtin !== undefined) {\n return builtin;\n }\n\n const extra = EXTRA_TAG_DEFINITIONS[normalized];\n if (extra !== undefined) {\n return extra;\n }\n\n const extensionRegistration = getExtensionConstraintTags(extensions).find(\n (tag) => tag.tagName === normalized\n );\n\n if (extensionRegistration === undefined) {\n return null;\n }\n\n return {\n canonicalName: extensionRegistration.tagName,\n valueKind: null,\n requiresArgument: true,\n supportedTargets: [\"none\"] as const,\n allowDuplicates: true,\n category: \"constraint\",\n placements: FIELD_PLACEMENTS,\n capabilities: [],\n completionDetail: `Extension constraint tag from ${extensionRegistration.extensionId}`,\n hoverMarkdown: [\n `**@${extensionRegistration.tagName}** \\`<value>\\``,\n \"\",\n `Extension-defined constraint tag from \\`${extensionRegistration.extensionId}\\`.`,\n \"\",\n `**Signature:** \\`@${extensionRegistration.tagName} <value>\\``,\n ].join(\"\\n\"),\n signatures: [\n {\n label: `@${extensionRegistration.tagName} <value>`,\n placements: FIELD_PLACEMENTS,\n parameters: [{ kind: \"value\", label: \"<value>\" }],\n },\n ],\n };\n}\n\nexport function getConstraintTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...custom];\n}\n\nexport function getAllTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const extras = Object.values(EXTRA_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...extras, ...custom];\n}\n\nexport function getTagHoverMarkdown(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): string | null {\n return getTagDefinition(rawName, extensions)?.hoverMarkdown ?? null;\n}\n\nfunction getExtensionConstraintTags(\n extensions: readonly ExtensionTagSource[] | undefined\n): readonly { extensionId: string; tagName: string }[] {\n return (\n extensions?.flatMap((extension) => {\n const tagRecords = extension.constraintTags ?? [];\n return tagRecords.map((tag) => ({\n extensionId: extension.extensionId,\n tagName: tag.tagName,\n }));\n }) ?? []\n );\n}\n","import type {\n CommentSpan,\n ParsedCommentTag,\n ParsedCommentTargetSpecifier,\n} from \"./comment-syntax.js\";\nimport type {\n CommentHoverInfo,\n CommentTagSemanticContext,\n SemanticCommentCompletionContext,\n} from \"./cursor-context.js\";\nimport {\n FORM_SPEC_PLACEMENTS,\n FORM_SPEC_TARGET_KINDS,\n type FormSpecPlacement,\n type FormSpecTargetKind,\n} from \"./tag-registry.js\";\n\n/** @public */\nexport const FORMSPEC_ANALYSIS_PROTOCOL_VERSION = 1;\n/** @public */\nexport const FORMSPEC_ANALYSIS_SCHEMA_VERSION = 1;\n\n/**\n * Cross-process endpoint used by the language server to reach the semantic\n * tsserver plugin on the current workspace host.\n *\n * @public\n */\nexport interface FormSpecIpcEndpoint {\n readonly kind: \"unix-socket\" | \"windows-pipe\";\n readonly address: string;\n}\n\n/**\n * Discovery record written by the tsserver plugin so other FormSpec tooling\n * can locate and validate the matching semantic service for a workspace.\n *\n * @public\n */\nexport interface FormSpecAnalysisManifest {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly analysisSchemaVersion: typeof FORMSPEC_ANALYSIS_SCHEMA_VERSION;\n readonly workspaceRoot: string;\n readonly workspaceId: string;\n readonly endpoint: FormSpecIpcEndpoint;\n readonly typescriptVersion: string;\n readonly extensionFingerprint: string;\n readonly generation: number;\n readonly updatedAt: string;\n}\n\n/**\n * Serializable subset of tag metadata needed by hover and completion UIs.\n *\n * @public\n */\nexport interface FormSpecSerializedTagDefinition {\n readonly canonicalName: string;\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n}\n\n/**\n * Serializable overload/signature summary for one comment tag form.\n *\n * @public\n */\nexport interface FormSpecSerializedTagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n}\n\n/**\n * Serialized representation of a parsed target specifier with exact spans.\n *\n * @public\n */\nexport interface FormSpecSerializedCommentTargetSpecifier {\n readonly rawText: string;\n readonly valid: boolean;\n readonly kind: ParsedCommentTargetSpecifier[\"kind\"];\n readonly fullSpan: CommentSpan;\n readonly colonSpan: CommentSpan;\n readonly span: CommentSpan;\n}\n\n/**\n * Semantic facts about one parsed tag, reduced to JSON-safe data for IPC.\n *\n * @public\n */\nexport interface FormSpecSerializedTagSemanticContext {\n readonly tagName: string;\n readonly tagDefinition: FormSpecSerializedTagDefinition | null;\n readonly placement: FormSpecPlacement | null;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly targetCompletions: readonly string[];\n readonly compatiblePathTargets: readonly string[];\n readonly valueLabels: readonly string[];\n readonly signatures: readonly FormSpecSerializedTagSignature[];\n readonly tagHoverMarkdown: string | null;\n readonly targetHoverMarkdown: string | null;\n readonly argumentHoverMarkdown: string | null;\n}\n\n/**\n * Cursor-scoped completion context serialized for transport between the\n * semantic tsserver plugin and the lightweight LSP.\n *\n * @public\n */\nexport type FormSpecSerializedCompletionContext =\n | {\n readonly kind: \"tag-name\";\n readonly prefix: string;\n readonly availableTags: readonly FormSpecSerializedTagDefinition[];\n }\n | {\n readonly kind: \"target\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n }\n | {\n readonly kind: \"argument\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n readonly valueLabels: readonly string[];\n }\n | {\n readonly kind: \"none\";\n };\n\n/**\n * Hover payload for a single comment token under the cursor.\n *\n * @public\n */\nexport interface FormSpecSerializedHoverInfo {\n readonly kind: CommentHoverInfo[\"kind\"];\n readonly markdown: string;\n}\n\n/**\n * File-local diagnostic derived from comment parsing or semantic analysis.\n *\n * @public\n */\nexport interface FormSpecAnalysisDiagnostic {\n readonly code: string;\n readonly message: string;\n readonly range: CommentSpan;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\n/**\n * Serializable view of a single parsed FormSpec tag within a doc comment.\n *\n * @public\n */\nexport interface FormSpecAnalysisTagSnapshot {\n readonly rawTagName: string;\n readonly normalizedTagName: string;\n readonly recognized: boolean;\n readonly fullSpan: CommentSpan;\n readonly tagNameSpan: CommentSpan;\n readonly payloadSpan: CommentSpan | null;\n readonly target: FormSpecSerializedCommentTargetSpecifier | null;\n readonly argumentSpan: CommentSpan | null;\n readonly argumentText: string;\n readonly semantic: FormSpecSerializedTagSemanticContext;\n}\n\n/**\n * Serializable view of one declaration-attached doc comment in a source file.\n *\n * @public\n */\nexport interface FormSpecAnalysisCommentSnapshot {\n readonly commentSpan: CommentSpan;\n readonly declarationSpan: CommentSpan;\n readonly placement: FormSpecPlacement | null;\n readonly subjectType: string | null;\n readonly hostType: string | null;\n readonly tags: readonly FormSpecAnalysisTagSnapshot[];\n}\n\n/**\n * Serializable analysis artifact for a single source file.\n *\n * @public\n */\nexport interface FormSpecAnalysisFileSnapshot {\n readonly filePath: string;\n readonly sourceHash: string;\n readonly generatedAt: string;\n readonly comments: readonly FormSpecAnalysisCommentSnapshot[];\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n}\n\n/**\n * Query variants supported by the semantic tsserver plugin.\n *\n * @public\n */\nexport type FormSpecSemanticQuery =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly filePath: string;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly filePath: string;\n };\n\n/**\n * Response variants returned by the semantic tsserver plugin.\n *\n * @public\n */\nexport type FormSpecSemanticResponse =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n readonly manifest: FormSpecAnalysisManifest;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly sourceHash: string;\n readonly context: FormSpecSerializedCompletionContext;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly sourceHash: string;\n readonly hover: FormSpecSerializedHoverInfo | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly sourceHash: string;\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly snapshot: FormSpecAnalysisFileSnapshot | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"error\";\n readonly error: string;\n };\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCommentSpan(value: unknown): value is CommentSpan {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<CommentSpan>;\n return typeof candidate.start === \"number\" && typeof candidate.end === \"number\";\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nconst FORM_SPEC_PLACEMENT_VALUES = new Set<FormSpecPlacement>(FORM_SPEC_PLACEMENTS);\n\nconst FORM_SPEC_TARGET_KIND_VALUES = new Set<FormSpecTargetKind>(FORM_SPEC_TARGET_KINDS);\n\nfunction isPlacementValue(value: unknown): value is FormSpecPlacement {\n return typeof value === \"string\" && FORM_SPEC_PLACEMENT_VALUES.has(value as FormSpecPlacement);\n}\n\nfunction isTargetKindValue(value: unknown): value is FormSpecTargetKind {\n return typeof value === \"string\" && FORM_SPEC_TARGET_KIND_VALUES.has(value as FormSpecTargetKind);\n}\n\nfunction isPlacementArray(value: unknown): value is readonly FormSpecPlacement[] {\n return Array.isArray(value) && value.every(isPlacementValue);\n}\n\nfunction isTargetKindArray(value: unknown): value is readonly FormSpecTargetKind[] {\n return Array.isArray(value) && value.every(isTargetKindValue);\n}\n\nfunction isIpcEndpoint(value: unknown): value is FormSpecIpcEndpoint {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecIpcEndpoint>;\n return (\n (candidate.kind === \"unix-socket\" || candidate.kind === \"windows-pipe\") &&\n typeof candidate.address === \"string\"\n );\n}\n\nfunction isSerializedTagDefinition(value: unknown): value is FormSpecSerializedTagDefinition {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagDefinition>;\n return (\n typeof candidate.canonicalName === \"string\" &&\n typeof candidate.completionDetail === \"string\" &&\n typeof candidate.hoverMarkdown === \"string\"\n );\n}\n\nfunction isSerializedTagSignature(value: unknown): value is FormSpecSerializedTagSignature {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSignature>;\n return typeof candidate.label === \"string\" && isPlacementArray(candidate.placements);\n}\n\nfunction isSerializedCommentTargetSpecifier(\n value: unknown\n): value is FormSpecSerializedCommentTargetSpecifier {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCommentTargetSpecifier>;\n return (\n typeof candidate.rawText === \"string\" &&\n typeof candidate.valid === \"boolean\" &&\n typeof candidate.kind === \"string\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.colonSpan) &&\n isCommentSpan(candidate.span)\n );\n}\n\nfunction isSerializedTagSemanticContext(\n value: unknown\n): value is FormSpecSerializedTagSemanticContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSemanticContext>;\n return (\n typeof candidate.tagName === \"string\" &&\n (candidate.tagDefinition === null || isSerializedTagDefinition(candidate.tagDefinition)) &&\n (candidate.placement === null || isPlacementValue(candidate.placement)) &&\n isTargetKindArray(candidate.supportedTargets) &&\n isStringArray(candidate.targetCompletions) &&\n isStringArray(candidate.compatiblePathTargets) &&\n isStringArray(candidate.valueLabels) &&\n Array.isArray(candidate.signatures) &&\n candidate.signatures.every(isSerializedTagSignature) &&\n (candidate.tagHoverMarkdown === null || typeof candidate.tagHoverMarkdown === \"string\") &&\n (candidate.targetHoverMarkdown === null || typeof candidate.targetHoverMarkdown === \"string\") &&\n (candidate.argumentHoverMarkdown === null ||\n typeof candidate.argumentHoverMarkdown === \"string\")\n );\n}\n\nfunction isSerializedCompletionContext(\n value: unknown\n): value is FormSpecSerializedCompletionContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCompletionContext>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"tag-name\":\n return typeof candidate.prefix === \"string\" && Array.isArray(candidate.availableTags)\n ? candidate.availableTags.every(isSerializedTagDefinition)\n : false;\n case \"target\":\n return isSerializedTagSemanticContext(candidate.semantic);\n case \"argument\":\n return (\n isSerializedTagSemanticContext(candidate.semantic) && isStringArray(candidate.valueLabels)\n );\n case \"none\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isSerializedHoverInfo(value: unknown): value is FormSpecSerializedHoverInfo {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedHoverInfo>;\n return (\n (candidate.kind === \"tag-name\" ||\n candidate.kind === \"target\" ||\n candidate.kind === \"argument\") &&\n typeof candidate.markdown === \"string\"\n );\n}\n\nfunction hasCurrentProtocolVersion(\n value: unknown\n): value is { readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION } {\n return isObjectRecord(value) && value[\"protocolVersion\"] === FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n}\n\nfunction isAnalysisDiagnostic(value: unknown): value is FormSpecAnalysisDiagnostic {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisDiagnostic>;\n return (\n typeof candidate.code === \"string\" &&\n typeof candidate.message === \"string\" &&\n isCommentSpan(candidate.range) &&\n (candidate.severity === \"error\" ||\n candidate.severity === \"warning\" ||\n candidate.severity === \"info\")\n );\n}\n\nfunction isAnalysisTagSnapshot(value: unknown): value is FormSpecAnalysisTagSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisTagSnapshot>;\n return (\n typeof candidate.rawTagName === \"string\" &&\n typeof candidate.normalizedTagName === \"string\" &&\n typeof candidate.recognized === \"boolean\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.tagNameSpan) &&\n (candidate.payloadSpan === null || isCommentSpan(candidate.payloadSpan)) &&\n (candidate.target === null || isSerializedCommentTargetSpecifier(candidate.target)) &&\n (candidate.argumentSpan === null || isCommentSpan(candidate.argumentSpan)) &&\n typeof candidate.argumentText === \"string\" &&\n isSerializedTagSemanticContext(candidate.semantic)\n );\n}\n\nfunction isAnalysisCommentSnapshot(value: unknown): value is FormSpecAnalysisCommentSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisCommentSnapshot>;\n return (\n isCommentSpan(candidate.commentSpan) &&\n isCommentSpan(candidate.declarationSpan) &&\n (candidate.placement === null || isPlacementValue(candidate.placement)) &&\n (candidate.subjectType === null || typeof candidate.subjectType === \"string\") &&\n (candidate.hostType === null || typeof candidate.hostType === \"string\") &&\n Array.isArray(candidate.tags) &&\n candidate.tags.every(isAnalysisTagSnapshot)\n );\n}\n\nfunction isAnalysisFileSnapshot(value: unknown): value is FormSpecAnalysisFileSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisFileSnapshot>;\n return (\n typeof candidate.filePath === \"string\" &&\n typeof candidate.sourceHash === \"string\" &&\n typeof candidate.generatedAt === \"string\" &&\n Array.isArray(candidate.comments) &&\n candidate.comments.every(isAnalysisCommentSnapshot) &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n}\n\n/**\n * Validates an unknown manifest payload from disk before consumers trust it.\n *\n * @public\n */\nexport function isFormSpecAnalysisManifest(value: unknown): value is FormSpecAnalysisManifest {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisManifest>;\n return (\n candidate.protocolVersion === FORMSPEC_ANALYSIS_PROTOCOL_VERSION &&\n candidate.analysisSchemaVersion === FORMSPEC_ANALYSIS_SCHEMA_VERSION &&\n typeof candidate.workspaceRoot === \"string\" &&\n typeof candidate.workspaceId === \"string\" &&\n isIpcEndpoint(candidate.endpoint) &&\n typeof candidate.typescriptVersion === \"string\" &&\n typeof candidate.extensionFingerprint === \"string\" &&\n typeof candidate.generation === \"number\" &&\n typeof candidate.updatedAt === \"string\"\n );\n}\n\n/**\n * Validates an unknown inbound IPC request before dispatching it.\n *\n * @public\n */\nexport function isFormSpecSemanticQuery(value: unknown): value is FormSpecSemanticQuery {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticQuery>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return true;\n case \"completion\":\n case \"hover\":\n return typeof candidate.filePath === \"string\" && typeof candidate.offset === \"number\";\n case \"diagnostics\":\n case \"file-snapshot\":\n return typeof candidate.filePath === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Validates an unknown IPC response before the language server consumes it.\n *\n * @public\n */\nexport function isFormSpecSemanticResponse(value: unknown): value is FormSpecSemanticResponse {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticResponse>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return isFormSpecAnalysisManifest(candidate.manifest);\n case \"completion\":\n return (\n typeof candidate.sourceHash === \"string\" && isSerializedCompletionContext(candidate.context)\n );\n case \"hover\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n (candidate.hover === null || isSerializedHoverInfo(candidate.hover))\n );\n case \"diagnostics\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n case \"file-snapshot\":\n return candidate.snapshot === null || isAnalysisFileSnapshot(candidate.snapshot);\n case \"error\":\n return typeof candidate.error === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Computes a stable, non-cryptographic hash for document staleness checks\n * across the plugin/LSP boundary.\n *\n * @public\n */\nexport function computeFormSpecTextHash(text: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Converts a parsed target specifier into its transport-safe JSON form.\n *\n * @public\n */\nexport function serializeCommentTargetSpecifier(\n target: ParsedCommentTargetSpecifier | null\n): FormSpecSerializedCommentTargetSpecifier | null {\n if (target === null) {\n return null;\n }\n\n return {\n rawText: target.rawText,\n valid: target.valid,\n kind: target.kind,\n fullSpan: target.fullSpan,\n colonSpan: target.colonSpan,\n span: target.span,\n };\n}\n\n/**\n * Serializes tag-level semantic context for cross-process consumption.\n *\n * @public\n */\nexport function serializeCommentTagSemanticContext(\n semantic: CommentTagSemanticContext\n): FormSpecSerializedTagSemanticContext {\n return {\n tagName: semantic.tag.normalizedTagName,\n tagDefinition:\n semantic.tagDefinition === null\n ? null\n : {\n canonicalName: semantic.tagDefinition.canonicalName,\n completionDetail: semantic.tagDefinition.completionDetail,\n hoverMarkdown: semantic.tagDefinition.hoverMarkdown,\n },\n placement: semantic.placement,\n supportedTargets: semantic.supportedTargets,\n targetCompletions: semantic.targetCompletions,\n compatiblePathTargets: semantic.compatiblePathTargets,\n valueLabels: semantic.valueLabels,\n signatures: semantic.signatures.map((signature) => ({\n label: signature.label,\n placements: signature.placements,\n })),\n tagHoverMarkdown: semantic.tagHoverMarkdown,\n targetHoverMarkdown: semantic.targetHoverMarkdown,\n argumentHoverMarkdown: semantic.argumentHoverMarkdown,\n };\n}\n\n/**\n * Serializes a cursor-scoped completion context for IPC.\n *\n * @public\n */\nexport function serializeCompletionContext(\n context: SemanticCommentCompletionContext\n): FormSpecSerializedCompletionContext {\n switch (context.kind) {\n case \"tag-name\":\n return {\n kind: \"tag-name\",\n prefix: context.prefix,\n availableTags: context.availableTags.map((tag) => ({\n canonicalName: tag.canonicalName,\n completionDetail: tag.completionDetail,\n hoverMarkdown: tag.hoverMarkdown,\n })),\n };\n case \"target\":\n return {\n kind: \"target\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n };\n case \"argument\":\n return {\n kind: \"argument\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n valueLabels: context.valueLabels,\n };\n case \"none\":\n return { kind: \"none\" };\n default: {\n const exhaustive: never = context;\n return exhaustive;\n }\n }\n}\n\n/**\n * Serializes hover information for cross-process transport.\n *\n * @public\n */\nexport function serializeHoverInfo(\n hover: CommentHoverInfo | null\n): FormSpecSerializedHoverInfo | null {\n return hover === null\n ? null\n : {\n kind: hover.kind,\n markdown: hover.markdown,\n };\n}\n\n/**\n * Serializes a parsed tag plus its semantic context into a file snapshot entry.\n *\n * @public\n */\nexport function serializeParsedCommentTag(\n tag: ParsedCommentTag,\n semantic: CommentTagSemanticContext\n): FormSpecAnalysisTagSnapshot {\n return {\n rawTagName: tag.rawTagName,\n normalizedTagName: tag.normalizedTagName,\n recognized: tag.recognized,\n fullSpan: tag.fullSpan,\n tagNameSpan: tag.tagNameSpan,\n payloadSpan: tag.payloadSpan,\n target: serializeCommentTargetSpecifier(tag.target),\n argumentSpan: tag.argumentSpan,\n argumentText: tag.argumentText,\n semantic: serializeCommentTagSemanticContext(semantic),\n };\n}\n","import path from \"node:path\";\nimport { computeFormSpecTextHash } from \"./semantic-protocol.js\";\n\n/**\n * Stable workspace-scoped identifier derived from the absolute workspace root.\n *\n * @public\n */\nexport function getFormSpecWorkspaceId(workspaceRoot: string): string {\n return computeFormSpecTextHash(workspaceRoot);\n}\n\n/**\n * Directory used for machine-generated FormSpec tooling state inside a\n * workspace.\n *\n * @public\n */\nexport function getFormSpecWorkspaceRuntimeDirectory(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".cache\", \"formspec\", \"tooling\");\n}\n\n/**\n * Path to the manifest that advertises the local FormSpec semantic service for\n * a workspace.\n *\n * @public\n */\nexport function getFormSpecManifestPath(workspaceRoot: string): string {\n return path.join(getFormSpecWorkspaceRuntimeDirectory(workspaceRoot), \"manifest.json\");\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,15 @@
1
1
  import type { CommentSpan, ParsedCommentTag, ParsedCommentTargetSpecifier } from "./comment-syntax.js";
2
2
  import type { CommentHoverInfo, CommentTagSemanticContext, SemanticCommentCompletionContext } from "./cursor-context.js";
3
- import type { FormSpecPlacement, FormSpecTargetKind } from "./tag-registry.js";
3
+ import { type FormSpecPlacement, type FormSpecTargetKind } from "./tag-registry.js";
4
+ /** @public */
4
5
  export declare const FORMSPEC_ANALYSIS_PROTOCOL_VERSION = 1;
6
+ /** @public */
5
7
  export declare const FORMSPEC_ANALYSIS_SCHEMA_VERSION = 1;
6
8
  /**
7
9
  * Cross-process endpoint used by the language server to reach the semantic
8
10
  * tsserver plugin on the current workspace host.
11
+ *
12
+ * @public
9
13
  */
10
14
  export interface FormSpecIpcEndpoint {
11
15
  readonly kind: "unix-socket" | "windows-pipe";
@@ -14,6 +18,8 @@ export interface FormSpecIpcEndpoint {
14
18
  /**
15
19
  * Discovery record written by the tsserver plugin so other FormSpec tooling
16
20
  * can locate and validate the matching semantic service for a workspace.
21
+ *
22
+ * @public
17
23
  */
18
24
  export interface FormSpecAnalysisManifest {
19
25
  readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;
@@ -28,6 +34,8 @@ export interface FormSpecAnalysisManifest {
28
34
  }
29
35
  /**
30
36
  * Serializable subset of tag metadata needed by hover and completion UIs.
37
+ *
38
+ * @public
31
39
  */
32
40
  export interface FormSpecSerializedTagDefinition {
33
41
  readonly canonicalName: string;
@@ -36,6 +44,8 @@ export interface FormSpecSerializedTagDefinition {
36
44
  }
37
45
  /**
38
46
  * Serializable overload/signature summary for one comment tag form.
47
+ *
48
+ * @public
39
49
  */
40
50
  export interface FormSpecSerializedTagSignature {
41
51
  readonly label: string;
@@ -43,6 +53,8 @@ export interface FormSpecSerializedTagSignature {
43
53
  }
44
54
  /**
45
55
  * Serialized representation of a parsed target specifier with exact spans.
56
+ *
57
+ * @public
46
58
  */
47
59
  export interface FormSpecSerializedCommentTargetSpecifier {
48
60
  readonly rawText: string;
@@ -54,6 +66,8 @@ export interface FormSpecSerializedCommentTargetSpecifier {
54
66
  }
55
67
  /**
56
68
  * Semantic facts about one parsed tag, reduced to JSON-safe data for IPC.
69
+ *
70
+ * @public
57
71
  */
58
72
  export interface FormSpecSerializedTagSemanticContext {
59
73
  readonly tagName: string;
@@ -71,6 +85,8 @@ export interface FormSpecSerializedTagSemanticContext {
71
85
  /**
72
86
  * Cursor-scoped completion context serialized for transport between the
73
87
  * semantic tsserver plugin and the lightweight LSP.
88
+ *
89
+ * @public
74
90
  */
75
91
  export type FormSpecSerializedCompletionContext = {
76
92
  readonly kind: "tag-name";
@@ -88,6 +104,8 @@ export type FormSpecSerializedCompletionContext = {
88
104
  };
89
105
  /**
90
106
  * Hover payload for a single comment token under the cursor.
107
+ *
108
+ * @public
91
109
  */
92
110
  export interface FormSpecSerializedHoverInfo {
93
111
  readonly kind: CommentHoverInfo["kind"];
@@ -95,6 +113,8 @@ export interface FormSpecSerializedHoverInfo {
95
113
  }
96
114
  /**
97
115
  * File-local diagnostic derived from comment parsing or semantic analysis.
116
+ *
117
+ * @public
98
118
  */
99
119
  export interface FormSpecAnalysisDiagnostic {
100
120
  readonly code: string;
@@ -104,6 +124,8 @@ export interface FormSpecAnalysisDiagnostic {
104
124
  }
105
125
  /**
106
126
  * Serializable view of a single parsed FormSpec tag within a doc comment.
127
+ *
128
+ * @public
107
129
  */
108
130
  export interface FormSpecAnalysisTagSnapshot {
109
131
  readonly rawTagName: string;
@@ -119,6 +141,8 @@ export interface FormSpecAnalysisTagSnapshot {
119
141
  }
120
142
  /**
121
143
  * Serializable view of one declaration-attached doc comment in a source file.
144
+ *
145
+ * @public
122
146
  */
123
147
  export interface FormSpecAnalysisCommentSnapshot {
124
148
  readonly commentSpan: CommentSpan;
@@ -130,6 +154,8 @@ export interface FormSpecAnalysisCommentSnapshot {
130
154
  }
131
155
  /**
132
156
  * Serializable analysis artifact for a single source file.
157
+ *
158
+ * @public
133
159
  */
134
160
  export interface FormSpecAnalysisFileSnapshot {
135
161
  readonly filePath: string;
@@ -140,6 +166,8 @@ export interface FormSpecAnalysisFileSnapshot {
140
166
  }
141
167
  /**
142
168
  * Query variants supported by the semantic tsserver plugin.
169
+ *
170
+ * @public
143
171
  */
144
172
  export type FormSpecSemanticQuery = {
145
173
  readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;
@@ -165,6 +193,8 @@ export type FormSpecSemanticQuery = {
165
193
  };
166
194
  /**
167
195
  * Response variants returned by the semantic tsserver plugin.
196
+ *
197
+ * @public
168
198
  */
169
199
  export type FormSpecSemanticResponse = {
170
200
  readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;
@@ -196,39 +226,57 @@ export type FormSpecSemanticResponse = {
196
226
  };
197
227
  /**
198
228
  * Validates an unknown manifest payload from disk before consumers trust it.
229
+ *
230
+ * @public
199
231
  */
200
232
  export declare function isFormSpecAnalysisManifest(value: unknown): value is FormSpecAnalysisManifest;
201
233
  /**
202
234
  * Validates an unknown inbound IPC request before dispatching it.
235
+ *
236
+ * @public
203
237
  */
204
238
  export declare function isFormSpecSemanticQuery(value: unknown): value is FormSpecSemanticQuery;
205
239
  /**
206
240
  * Validates an unknown IPC response before the language server consumes it.
241
+ *
242
+ * @public
207
243
  */
208
244
  export declare function isFormSpecSemanticResponse(value: unknown): value is FormSpecSemanticResponse;
209
245
  /**
210
246
  * Computes a stable, non-cryptographic hash for document staleness checks
211
247
  * across the plugin/LSP boundary.
248
+ *
249
+ * @public
212
250
  */
213
251
  export declare function computeFormSpecTextHash(text: string): string;
214
252
  /**
215
253
  * Converts a parsed target specifier into its transport-safe JSON form.
254
+ *
255
+ * @public
216
256
  */
217
257
  export declare function serializeCommentTargetSpecifier(target: ParsedCommentTargetSpecifier | null): FormSpecSerializedCommentTargetSpecifier | null;
218
258
  /**
219
259
  * Serializes tag-level semantic context for cross-process consumption.
260
+ *
261
+ * @public
220
262
  */
221
263
  export declare function serializeCommentTagSemanticContext(semantic: CommentTagSemanticContext): FormSpecSerializedTagSemanticContext;
222
264
  /**
223
265
  * Serializes a cursor-scoped completion context for IPC.
266
+ *
267
+ * @public
224
268
  */
225
269
  export declare function serializeCompletionContext(context: SemanticCommentCompletionContext): FormSpecSerializedCompletionContext;
226
270
  /**
227
271
  * Serializes hover information for cross-process transport.
272
+ *
273
+ * @public
228
274
  */
229
275
  export declare function serializeHoverInfo(hover: CommentHoverInfo | null): FormSpecSerializedHoverInfo | null;
230
276
  /**
231
277
  * Serializes a parsed tag plus its semantic context into a file snapshot entry.
278
+ *
279
+ * @public
232
280
  */
233
281
  export declare function serializeParsedCommentTag(tag: ParsedCommentTag, semantic: CommentTagSemanticContext): FormSpecAnalysisTagSnapshot;
234
282
  //# sourceMappingURL=semantic-protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-protocol.d.ts","sourceRoot":"","sources":["../src/semantic-protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantic-protocol.d.ts","sourceRoot":"","sources":["../src/semantic-protocol.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,8 @@ export interface ExtensionTagSource {
38
38
  readonly extensionId: string;
39
39
  readonly constraintTags?: readonly ExtensionConstraintTagSource[];
40
40
  }
41
+ export declare const FORM_SPEC_PLACEMENTS: readonly ["class", "class-field", "class-method", "interface", "interface-field", "type-alias", "type-alias-field", "variable", "function", "function-parameter", "method-parameter"];
42
+ export declare const FORM_SPEC_TARGET_KINDS: readonly ["none", "path", "member", "variant"];
41
43
  export declare function normalizeFormSpecTagName(rawName: string): string;
42
44
  export declare function getTagDefinition(rawName: string, extensions?: readonly ExtensionTagSource[]): TagDefinition | null;
43
45
  export declare function getConstraintTagDefinitions(extensions?: readonly ExtensionTagSource[]): readonly TagDefinition[];
@@ -1 +1 @@
1
- {"version":3,"file":"tag-registry.d.ts","sourceRoot":"","sources":["../src/tag-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tag-registry.d.ts","sourceRoot":"","sources":["../src/tag-registry.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,21 @@
1
1
  /**
2
2
  * Stable workspace-scoped identifier derived from the absolute workspace root.
3
+ *
4
+ * @public
3
5
  */
4
6
  export declare function getFormSpecWorkspaceId(workspaceRoot: string): string;
5
7
  /**
6
8
  * Directory used for machine-generated FormSpec tooling state inside a
7
9
  * workspace.
10
+ *
11
+ * @public
8
12
  */
9
13
  export declare function getFormSpecWorkspaceRuntimeDirectory(workspaceRoot: string): string;
10
14
  /**
11
15
  * Path to the manifest that advertises the local FormSpec semantic service for
12
16
  * a workspace.
17
+ *
18
+ * @public
13
19
  */
14
20
  export declare function getFormSpecManifestPath(workspaceRoot: string): string;
15
21
  //# sourceMappingURL=workspace-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-runtime.d.ts","sourceRoot":"","sources":["../src/workspace-runtime.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAElF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAErE"}
1
+ {"version":3,"file":"workspace-runtime.d.ts","sourceRoot":"","sources":["../src/workspace-runtime.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAElF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAErE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formspec/analysis",
3
- "version": "0.1.0-alpha.20",
3
+ "version": "0.1.0-alpha.21",
4
4
  "description": "Shared comment-tag analysis utilities for FormSpec tooling",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -11,6 +11,16 @@
11
11
  "types": "./dist/analysis.d.ts",
12
12
  "import": "./dist/index.js",
13
13
  "require": "./dist/index.cjs"
14
+ },
15
+ "./protocol": {
16
+ "types": "./dist/protocol.d.ts",
17
+ "import": "./dist/protocol.js",
18
+ "require": "./dist/protocol.cjs"
19
+ },
20
+ "./internal": {
21
+ "types": "./dist/internal.d.ts",
22
+ "import": "./dist/internal.js",
23
+ "require": "./dist/internal.cjs"
14
24
  }
15
25
  },
16
26
  "files": [
@@ -18,7 +28,7 @@
18
28
  "README.md"
19
29
  ],
20
30
  "dependencies": {
21
- "@formspec/core": "0.1.0-alpha.19"
31
+ "@formspec/core": "0.1.0-alpha.21"
22
32
  },
23
33
  "peerDependencies": {
24
34
  "typescript": "^5.0.0"