@canonical/terrazzo-lsp

中文文档
0.44.0发布于 2026/10/23LGPL-3.0TypeScriptES Module构建来源已验证近 30 天下载 6040

语言服务器为设计令牌工作流程提供CSS自定义属性智能. 包括完成、悬浮、诊断、去定义、重命名、文档颜色和工作空间符号.

中文使用文档
文档目录12 节
  1. 特征
  2. 编辑器设置
  3. 国 际
  4. 参考文献
  5. CSS 诊断实例
  6. DTCG 诊断例
  7. 压制语法
  8. 配置
  9. 完整配置参考
  10. VS 代码扩展设置
  11. 发展
  12. 建筑

@canonical/terrazzo-lsp

语言服务器为设计令牌工作流程提供CSS自定义属性智能. 读取 tokens.json 构建文物并提供CSS和SCSS文件的编辑功能.

特征

特性说明
完成情况了解背景的建议 var(--...) 参考书目,按类型可转让性、语义层次和出处排列.
缓冲切入元数据,包括已解析的值,颜色监视,别名链条,分级徽章,选择器上下文,以及源位置.
诊断类型不匹配检测,缺失/堆积倒置警告,不可取用符分析,原始用法警告等.
转到定义从一个跳 var() 提及象征性声明.
重命名重命名导入图中所有文件中的 CSS 自定义属性 .
文档颜色内置色表和色取器,用于表示后置色值.
语义符号语法突出区分出文物标志,地产,外出参考.
工作空间符号按名称或类型搜索整个工作空间的标志.

编辑器设置

VS 代码 (建议):

npm install -D @canonical/design-tokens
npx @canonical/terrazzo-lsp-extension

扩展自动检测 bun 先掉头 node >= 22。 。 。 .

国 际

npx terrazzo-lsp --stdio                # Start LSP server on stdio
npx terrazzo-lsp --stdio --allow-degraded  # Start with reduced capabilities when config is missing
npx terrazzo-lsp check [globs]          # Run diagnostics on CSS files
npx terrazzo-lsp status                 # Show config and artifact status
npx terrazzo-lsp inspect <var>          # Inspect a CSS custom property
npx terrazzo-lsp resolve <spec>         # Resolve an import specifier
npx terrazzo-lsp graph <file>           # Show import graph from a file

参考文献

LSP发布14个诊断码. CSS诊断在工作空间的每个CSS/SCSS文件中运行. DTCG 诊断在装入时运行一次 tokens.json 文物和鉴定是否符合 DTCG 2025。 10 规格。 每个诊断可以配置到 "error", (中文(简体) ), "warning", (中文(简体) ), "info",或 "off" 内 terrazzo-lsp.config.json。 。 。 .

代码配置密钥默认说明
css/unknown-varunknownProperties关A 类 var() 引用不匹配任何已知的自定义属性.
css/missing-fallbackmissingFallback警告A 类 var() 提及非艺术财产无倒置价值,无 @property 登记。 跳过文物代币,因为这些代币被保证被定义.
css/stale-fallbackstaleFallback警告倒数一 var() 不匹配该符号的当前解析值.
css/type-mismatchtypeMismatch错误一个符号的 DTCG 类型与 CSS 属性不相容( 例如: 颜色符号 in padding) (中文(简体) ).
css/type-uncertaintypeUncertain资讯键入的令牌出现在一个可以接受多个值类型的短手或上下文中.
css/unreachable-tokenunreachableToken警告该符号的文物输出文件无法通过 @import 图表或全局样式表.
css/primitive-tokenprimitiveToken警告直接使用一种原始的代号,在代名词中应优先使用.
css/scoped-usagescopedDeclaration警告在特定选定人范围下宣布的标志在更广泛的范围内使用.
css/no-color-schemelightDarkNoScheme资讯A 类 light-dark() 数值没有 color-scheme 在选择者或祖先上声明.
dtcg/broken-aliasbrokenAlias错误文物中的别名指代不存在的代号ID.
dtcg/schema-violationschemaViolation错误表示符的值对其已声明的无效 $type (例如:. $type: color ),无色值.
dtcg/circular-aliascircularAlias错误别名链会形成一个循环——一个符号ID在解析路径中不止一次出现.
dtcg/missing-typeinferredType资讯一个标志没有明确的 $type 其类型模糊不清.
dtcg/draft-syntaxdraftFormat资讯符号使用标准化前的字段语法草案(value编号 :type 无 $ 前缀).

CSS 诊断实例

下面的例子触发一个文件中的每个 CSS 诊断:

/* Assume the following tokens exist in the artifact:
 *   --color-fg           : oklch(17.2% 0 0)        tier: semantic, type: color
 *   --spacing-sm         : 0.5rem                   tier: semantic, type: dimension
 *   --color-palette-blue : oklch(50% 0.15 250)      tier: primitive, type: color
 *   --button-pad         : 0.75rem                  tier: semantic, scoped to .button
 *   --unreachable-token  : 1rem                     (in a file not imported by this sheet)
 */

/* css/unknown-var — off by default, enable via config */
.unknown   { margin: var(--does-not-exist); }

/* css/missing-fallback — no fallback for a non-artifact property */
.missing   { padding: var(--local-pad); }

/* css/stale-fallback — resolved value is 0.5rem, not 16px */
.stale     { gap: var(--spacing-sm, 16px); }

/* css/type-mismatch — colour token in a length context */
.type-err  { width: var(--color-fg); }

/* css/type-uncertain — dimension in a shorthand accepting many types */
.type-warn { background: var(--spacing-sm); }

/* css/unreachable-token — output file not in @import graph */
.unreach   { margin: var(--unreachable-token); }

/* css/primitive-token — prefer semantic alias */
.primitive { color: var(--color-palette-blue); }

/* css/scoped-usage — --button-pad is scoped to .button */
.card      { padding: var(--button-pad); }

/* css/no-color-scheme — light-dark() without color-scheme */
.no-scheme { color: light-dark(black, white); }

DTCG 诊断例

DTCG诊断在符号定义本身的表面问题. 这些出现在 tokens.json 文物条目, 不在 CSS 文件中 :

{
  // dtcg/broken-alias — alias target does not exist
  "color.ghost":   { "aliasChain": ["color.nonexistent"], "type": "color" },

  // dtcg/schema-violation — "not-a-colour" is not a valid CSS colour
  "color.invalid": { "valueLight": "not-a-colour", "type": "color" },

  // dtcg/circular-alias — loop-a → loop-b → loop-a
  "color.loop-a":  { "aliasChain": ["color.loop-b", "color.loop-a"], "type": "color" },

  // dtcg/missing-type — no $type field, type is ambiguous
  "spacing.bare":  { "valueLight": "4px", "type": null },

  // dtcg/draft-syntax — uses pre-standard value/type without $ prefix
  "color.legacy":  { "type": "color", "extensions": { "com.terrazzo.draft-syntax": true } }
}

压制语法

诊断可用下列评论压制:

/* Disable all checks for a region: */
/* terrazzo-lsp-disable */
.suppressed { width: var(--color-fg); }
/* terrazzo-lsp-enable */

/* Disable a specific code for the next line: */
/* terrazzo-lsp-disable css/primitive-token */
.selective { color: var(--color-palette-blue); }
/* terrazzo-lsp-enable css/primitive-token */

配置

创建一个 terrazzo-lsp.config.json 在工作空间根中:

{
  "artifacts": ["@canonical/design-tokens/dist/tokens.json"],
  "globalStylesheets": [".storybook/styles.css"]
}

如果没有配置文件, 输出面板记录每个候选路径 尝试,打印一个可复制的启动配置,然后退出。 临时 降低启动、通过 --allow-degraded。 。 。 .

{ "artifacts": ["@canonical/design-tokens/dist/tokens.json"] }

完整配置参考

{
  "artifacts": [],
  "distDir": "dist",
  "scanGlobs": ["src/**/*.css", "src/**/*.scss"],
  "globalStylesheets": null,
  "diagnostics": {
    "unknownProperties": "off",
    "missingFallback": "warning",
    "staleFallback": "warning",
    "typeMismatch": "error",
    "typeUncertain": "info",
    "unreachableToken": "warning",
    "primitiveToken": "warning",
    "scopedDeclaration": "warning",
    "lightDarkNoScheme": "info",
    "brokenAlias": "error",
    "schemaViolation": "error",
    "circularAlias": "error",
    "inferredType": "info",
    "draftFormat": "info",
    "ignoreGlobs": []
  },
  "hover": {
    "showColourSwatches": true,
    "showSelectorContext": true,
    "showProvenanceBadge": true,
    "showAliasChain": true,
    "showSourceLocation": true,
    "showNavigationTier": true,
    "showSpecReferences": true
  },
  "inlayHints": {
    "enabled": false,
    "showColourSwatches": true
  },
  "logLevel": "info"
}
密钥说明
artifacts路径 tokens.json 建造文物. 光谱师解决 node_modules/。相对路径必须始于 ./ 或者说 ../。 。 。 .
distDir目录包含 *.css.map 用于源代码映射的文件.
scanGlobsCSS/SCSS文件扫描诊断的Glob模式.
globalStylesheetsCSS文件从每个文档中都隐含可以到达. null 指从文物中自动取出.
diagnostics诊断严重性超过。 数值 : "error", (中文(简体) ), "warning", (中文(简体) ), "info", (中文(简体) ), "off"。 。 。 .
diagnostics.ignoreGlobs排除诊断文件的 Glob 模式 .
hover切换悬浮弹出物的单个部分.
inlayHints内置提示显示( 默认损坏) .
logLevel服务器日志动词 : "off", (中文(简体) ), "error", (中文(简体) ), "warn", (中文(简体) ), "info", (中文(简体) ), "debug"。 。 。 .

VS 代码扩展设置

设置默认说明
terrazzo-lsp.serverPath""路径 dist/esm/cli.js。如果为空,请使用捆绑的服务器.
terrazzo-lsp.runtime""运行时间覆盖 。 空 = 自动检测( E)bun 喜欢, node >= 22 倒计时).
terrazzo-lsp.trace.server"off""off" 只显示启动摘要. "verbose" 在输出通道中添加每个请求的痕迹 .

发展

建筑

LSP 服务器主要分为四层:

层路径责任
议定书protocol/JSON- RPC 消息解析, 配置装入, 请求/ 响应匹配
运行时间runtime/服务器使用寿命周期、文件管理、进口图形建筑、工人调度
图graph/托肯图数据结构、文物装载、可达性缓存
供应商providers/所有LSP特征:完成,徘徊,诊断,重命名等.

诊断管道:

CSS diagnostics:  orchestrateDiagnostics → per-rule check modules → makeDiagnostic
DTCG diagnostics: produceArtifactDiagnostics → per-rule check modules → makeDiagnostic

每个诊断规则都生活在自己的档案中(diagnostics/checkMissingFallback.ts, (中文(简体) ), artifactDiagnostics/checkBrokenAlias.ts(例如) 与同一地点 .tests.ts 文档。 管弦乐团绕过用法(CSS)或道具(DTCG)并代表每个检查功能.

bun run build      # Compile LSP server (tsc)
bun run test       # Run tests
bun run check      # Lint + type check

版本与发布记录

@canonical/terrazzo-lsp 共发布 26 个版本,首次发布于 2026/03/08;过去 12 个月发布了 26 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.44.0latest2026/10/2317 天前
0.43.02026/10/011 个月前
0.43.0-experimental.0experimental2026/09/291 个月前
0.10.02026/09/092 个月前
0.9.02026/09/072 个月前
0.8.22026/08/282 个月前

关于 @canonical/terrazzo-lsp 的常见问题

@canonical/terrazzo-lsp 是什么?

语言服务器为设计令牌工作流程提供CSS自定义属性智能. 包括完成、悬浮、诊断、去定义、重命名、文档颜色和工作空间符号.

如何安装 @canonical/terrazzo-lsp?

在项目目录运行 npm install @canonical/terrazzo-lsp,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 terrazzo-lsp,可以用 npx terrazzo-lsp 直接运行。

@canonical/terrazzo-lsp 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@canonical/terrazzo-lsp 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@canonical/terrazzo-lsp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@canonical/terrazzo-lsp 可以商用吗?

@canonical/terrazzo-lsp 使用 LGPL-3.0 许可。弱 Copyleft:作为库被调用时通常不要求开源你自己的代码,但修改库本身需以 LGPL 开源;前端打包合并后的适用边界存在不同理解。以上为概括,不构成法律意见,请以许可原文为准。

@canonical/terrazzo-lsp 的下载量有多少?

根据 npm 官方下载统计,@canonical/terrazzo-lsp 在 2026/10/09 – 2026/11/07 这 30 天内被下载 6,040 次,日均约 201 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@canonical/terrazzo-lsp 还在维护吗?

最新版本 0.44.0 发布于 2026/10/23(17 天前);至今共发布 26 个版本,其中过去 12 个月发布了 26 个;首次发布于 2026/03/08。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。