cordis.yml读取用户值
config 节点提供当前部署的选择。
类型与运行时校验
用同名 Config 类型和 Schemastery schema 接收配置,在加载时校验并填充默认值。
import type { Context } from '@deepseek-ai/cordis'
import Schema from '@deepseek-ai/schemastery'
export const name = 'my-plugin'
export interface Config {
greeting: string
maxRetries: number
verbose?: boolean
}
export const Config: Schema<Config> = Schema.object({
greeting: Schema.string().default('Hello'),
maxRetries: Schema.number().default(3),
verbose: Schema.boolean().default(false),
})
export function apply(ctx: Context, config: Config) {
console.log(config.greeting)
}
TypeScript 类型服务开发期,Schemastery schema 负责运行时。两者同名,但职责不同。
cordis.ymlconfig 节点提供当前部署的选择。
Config schema字段规则在插件加载期间执行。
apply(ctx, config)apply 读取用户值或 schema 默认值。
plugin instance实现无需重新解析原始 YAML。
保留“第一个插件”教程中已经验证的绝对路径,只增加 config 节点。这样 greeting 覆盖默认值,未写入的 verbose 仍使用 false。
- insert:
- id: hello
name: '/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts'
config:
greeting: 'Hi there'
maxRetries: 5官方配置篇片段使用 ./src/my-plugin.ts,但同一提交的第一篇教程明确说明 patch 不改变模块解析所用的 profile 目录,并要求绝对路径。本站保持绝对路径,避免教程链在此中断。
required、default 和 union 都属于 schema。无效值应让插件以明确错误停止加载,而不是带着错误状态进入执行路径。
export interface Config {
apiKey: string
timeout: number
mode: 'fast' | 'accurate'
}
export const Config = Schema.object({
apiKey: Schema.string().required(),
timeout: Schema.number().default(30000),
mode: Schema.union(['fast', 'accurate']).default('fast'),
})不要导出普通对象作为 Config。Cordis 需要它实现 Standard Schema 接口。
如果两个部署可能需要不同值,它就应该是配置字段,而不是代码常量。
const TIMEOUT = 30000timeoutMs: number框架先卸载旧实例,再加载新实例。通过 ctx 注册的 effect 会自动清理,所以旧注册不会残留。