@fantasticit/sumi 0.7.4 → 0.7.6

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.
Files changed (115) hide show
  1. package/README.md +27 -25
  2. package/dist/adapters.d.ts +24 -3
  3. package/dist/adapters.js +101 -15
  4. package/dist/adapters.js.map +1 -1
  5. package/dist/agent-hooks.d.ts +18 -0
  6. package/dist/agent-hooks.js +144 -5
  7. package/dist/agent-hooks.js.map +1 -1
  8. package/dist/agents.js +36 -3
  9. package/dist/agents.js.map +1 -1
  10. package/dist/cli.d.ts +3 -1
  11. package/dist/cli.js +4 -4
  12. package/dist/cli.js.map +1 -1
  13. package/dist/context.d.ts +27 -0
  14. package/dist/context.js +28 -10
  15. package/dist/context.js.map +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.js +1 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/instructions.js +4 -4
  20. package/dist/instructions.js.map +1 -1
  21. package/dist/task.d.ts +1 -0
  22. package/dist/task.js +170 -0
  23. package/dist/task.js.map +1 -0
  24. package/node_modules/@sumi/create/dist/bin.d.ts +2 -0
  25. package/node_modules/@sumi/create/dist/bin.js +52 -0
  26. package/node_modules/@sumi/create/dist/bin.js.map +1 -0
  27. package/node_modules/@sumi/create/package.json +1 -1
  28. package/node_modules/@sumi/kernel/dist/config.d.ts +5 -0
  29. package/node_modules/@sumi/kernel/dist/config.js +16 -0
  30. package/node_modules/@sumi/kernel/dist/config.js.map +1 -1
  31. package/node_modules/@sumi/kernel/dist/engine.js +1 -0
  32. package/node_modules/@sumi/kernel/dist/engine.js.map +1 -1
  33. package/node_modules/@sumi/kernel/dist/registry.d.ts +2 -0
  34. package/node_modules/@sumi/kernel/dist/registry.js +15 -1
  35. package/node_modules/@sumi/kernel/dist/registry.js.map +1 -1
  36. package/node_modules/@sumi/kernel/package.json +2 -2
  37. package/node_modules/@sumi/plugin-sdk/README.md +62 -36
  38. package/node_modules/@sumi/plugin-sdk/dist/index.d.ts +1 -0
  39. package/node_modules/@sumi/plugin-sdk/dist/index.js +1 -0
  40. package/node_modules/@sumi/plugin-sdk/dist/index.js.map +1 -1
  41. package/node_modules/@sumi/plugin-sdk/dist/protocol.d.ts +64 -1
  42. package/node_modules/@sumi/plugin-sdk/dist/protocol.js +17 -0
  43. package/node_modules/@sumi/plugin-sdk/dist/protocol.js.map +1 -1
  44. package/node_modules/@sumi/plugin-sdk/dist/rules.d.ts +1 -4
  45. package/node_modules/@sumi/plugin-sdk/dist/rules.js.map +1 -1
  46. package/node_modules/@sumi/plugin-sdk/dist/session-context.d.ts +7 -0
  47. package/node_modules/@sumi/plugin-sdk/dist/session-context.js +62 -0
  48. package/node_modules/@sumi/plugin-sdk/dist/session-context.js.map +1 -0
  49. package/node_modules/@sumi/plugin-sdk/dist/validate.js +51 -2
  50. package/node_modules/@sumi/plugin-sdk/dist/validate.js.map +1 -1
  51. package/node_modules/@sumi/plugin-sdk/package.json +1 -1
  52. package/node_modules/@sumi/plugins-core/README.md +14 -12
  53. package/node_modules/@sumi/plugins-core/dist/plugins/exec.js +7 -2
  54. package/node_modules/@sumi/plugins-core/dist/plugins/exec.js.map +1 -1
  55. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js +12 -3
  56. package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js.map +1 -1
  57. package/node_modules/@sumi/plugins-core/dist/test-scope.d.ts +1 -1
  58. package/node_modules/@sumi/plugins-core/dist/test-scope.js +12 -6
  59. package/node_modules/@sumi/plugins-core/dist/test-scope.js.map +1 -1
  60. package/node_modules/@sumi/plugins-core/dist/tool-batches.d.ts +11 -0
  61. package/node_modules/@sumi/plugins-core/dist/tool-batches.js +41 -0
  62. package/node_modules/@sumi/plugins-core/dist/tool-batches.js.map +1 -0
  63. package/node_modules/@sumi/plugins-core/dist/vitest-runner.js +129 -5
  64. package/node_modules/@sumi/plugins-core/dist/vitest-runner.js.map +1 -1
  65. package/node_modules/@sumi/plugins-core/instructions/bugfix.md +9 -0
  66. package/node_modules/@sumi/plugins-core/instructions/feature.md +9 -0
  67. package/node_modules/@sumi/plugins-core/package.json +4 -4
  68. package/node_modules/@sumi/plugins-core/sumi-plugins.yaml +2 -1
  69. package/node_modules/@sumi/plugins-governance/README.md +10 -9
  70. package/node_modules/@sumi/plugins-governance/dist/checkout.d.ts +12 -2
  71. package/node_modules/@sumi/plugins-governance/dist/checkout.js +40 -3
  72. package/node_modules/@sumi/plugins-governance/dist/checkout.js.map +1 -1
  73. package/node_modules/@sumi/plugins-governance/dist/commands/gate.js +6 -2
  74. package/node_modules/@sumi/plugins-governance/dist/commands/gate.js.map +1 -1
  75. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js +1 -1
  76. package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js.map +1 -1
  77. package/node_modules/@sumi/plugins-governance/dist/gate-cache.d.ts +25 -0
  78. package/node_modules/@sumi/plugins-governance/dist/gate-cache.js +83 -0
  79. package/node_modules/@sumi/plugins-governance/dist/gate-cache.js.map +1 -0
  80. package/node_modules/@sumi/plugins-governance/dist/hooks.d.ts +2 -0
  81. package/node_modules/@sumi/plugins-governance/dist/hooks.js +4 -0
  82. package/node_modules/@sumi/plugins-governance/dist/hooks.js.map +1 -0
  83. package/node_modules/@sumi/plugins-governance/dist/protected.d.ts +1 -0
  84. package/node_modules/@sumi/plugins-governance/instructions/push.md +1 -1
  85. package/node_modules/@sumi/plugins-governance/package.json +2 -2
  86. package/node_modules/@sumi/plugins-openspec/package.json +2 -2
  87. package/node_modules/@sumi/plugins-openspec/sumi-plugins.yaml +2 -0
  88. package/node_modules/@sumi/plugins-precedent/README.md +8 -0
  89. package/node_modules/@sumi/plugins-precedent/dist/after-edit-context.d.ts +28 -0
  90. package/node_modules/@sumi/plugins-precedent/dist/after-edit-context.js +204 -0
  91. package/node_modules/@sumi/plugins-precedent/dist/after-edit-context.js.map +1 -0
  92. package/node_modules/@sumi/plugins-precedent/dist/commands/after-edit-context.d.ts +1 -0
  93. package/node_modules/@sumi/plugins-precedent/dist/commands/after-edit-context.js +13 -0
  94. package/node_modules/@sumi/plugins-precedent/dist/commands/after-edit-context.js.map +1 -0
  95. package/node_modules/@sumi/plugins-precedent/dist/commands/before-edit-context.d.ts +1 -0
  96. package/node_modules/@sumi/plugins-precedent/dist/commands/before-edit-context.js +10 -0
  97. package/node_modules/@sumi/plugins-precedent/dist/commands/before-edit-context.js.map +1 -0
  98. package/node_modules/@sumi/plugins-precedent/dist/commands/context.js +15 -5
  99. package/node_modules/@sumi/plugins-precedent/dist/commands/context.js.map +1 -1
  100. package/node_modules/@sumi/plugins-precedent/dist/commands/on-prompt-context.d.ts +1 -0
  101. package/node_modules/@sumi/plugins-precedent/dist/commands/on-prompt-context.js +55 -0
  102. package/node_modules/@sumi/plugins-precedent/dist/commands/on-prompt-context.js.map +1 -0
  103. package/node_modules/@sumi/plugins-precedent/dist/model.d.ts +2 -0
  104. package/node_modules/@sumi/plugins-precedent/dist/model.js.map +1 -1
  105. package/node_modules/@sumi/plugins-precedent/package.json +3 -3
  106. package/node_modules/@sumi/plugins-precedent/sumi-plugins.yaml +29 -0
  107. package/node_modules/@sumi/plugins-review/dist/commands/context.js +18 -3
  108. package/node_modules/@sumi/plugins-review/dist/commands/context.js.map +1 -1
  109. package/node_modules/@sumi/plugins-review/dist/review.d.ts +1 -0
  110. package/node_modules/@sumi/plugins-review/dist/review.js.map +1 -1
  111. package/node_modules/@sumi/plugins-review/package.json +3 -3
  112. package/package.json +10 -10
  113. package/node_modules/@sumi/kernel/test/fixtures/fake-plugin.mjs +0 -44
  114. package/node_modules/@sumi/kernel/test/fixtures/py-plugin.py +0 -3
  115. package/node_modules/@sumi/plugin-sdk/test/isolate-tmpdir.ts +0 -27
@@ -8,22 +8,23 @@
8
8
 
9
9
  ### 上下文(stdin,`PluginContext`)
10
10
 
11
- | 字段 | 类型 | 说明 |
12
- | ------------- | ------------------------- | --------------------------------------------------------------------------------- |
13
- | `repoRoot` | `string` | 仓库根 |
14
- | `base` | `string \| null` | 基准提交 OID;`null` 表示空树 |
15
- | `mode` | `'worktree' \| 'commit'` | 工作区模式或固定提交模式 |
16
- | `tier` | `string` | 本次运行的档位 |
17
- | `tiers` | `string[]` | 全部档位,从低到高 |
18
- | `stepId` | `string` | 步骤实例 id |
19
- | `config` | `Record<string, unknown>` | 插件声明的 `with` 与步骤 `with` 合并后的配置 |
20
- | `files` | `string[]` | 本步骤的文件范围:检查步骤已按 `triggers` 与 `exclude` 过滤,并含规划器注入的文件 |
21
- | `all` | `boolean` | 是否为全量运行 |
22
- | `obligations` | `Obligation[]` | 规划器注入的义务(`id`、`type`、`target`、`required`) |
23
- | `evidenceDir` | `string` | 本步骤的证据目录 |
24
- | `runDir` | `string` | 本次运行目录 |
25
- | `runId` | `string` | 运行 id |
26
- | `labels` | `Record<string, string>` | 运行标签 |
11
+ | 字段 | 类型 | 说明 |
12
+ | ------------- | -------------------------- | --------------------------------------------------------------------------------- |
13
+ | `repoRoot` | `string` | 仓库根 |
14
+ | `pathHints` | `Record<string, string[]>` | 已启用插件包汇总并经项目配置增删的仓库相对路径 glob;内核不解释提示名 |
15
+ | `base` | `string \| null` | 基准提交 OID;`null` 表示空树 |
16
+ | `mode` | `'worktree' \| 'commit'` | 工作区模式或固定提交模式 |
17
+ | `tier` | `string` | 本次运行的档位 |
18
+ | `tiers` | `string[]` | 全部档位,从低到高 |
19
+ | `stepId` | `string` | 步骤实例 id |
20
+ | `config` | `Record<string, unknown>` | 插件声明的 `with` 与步骤 `with` 合并后的配置 |
21
+ | `files` | `string[]` | 本步骤的文件范围:检查步骤已按 `triggers` 与 `exclude` 过滤,并含规划器注入的文件 |
22
+ | `all` | `boolean` | 是否为全量运行 |
23
+ | `obligations` | `Obligation[]` | 规划器注入的义务(`id`、`type`、`target`、`required`) |
24
+ | `evidenceDir` | `string` | 本步骤的证据目录 |
25
+ | `runDir` | `string` | 本次运行目录 |
26
+ | `runId` | `string` | 运行 id |
27
+ | `labels` | `Record<string, string>` | 运行标签 |
27
28
 
28
29
  ### 结果(stdout,`PluginResult`)
29
30
 
@@ -53,26 +54,51 @@
53
54
 
54
55
  插件包在包根的 `sumi-plugins.yaml` 中以 `plugins:` 列出声明;项目插件每个目录一个 `plugin.yaml`。声明有三种形态:可执行插件(`command`)、派生插件(`base`)、只提供命令与 hook 的插件(不声明 `command`,但声明 `commands` 或 `hooks`)。
55
56
 
56
- | 字段 | 说明 |
57
- | --------------- | --------------------------------------------------------------------------------------------------------------------------------- |
58
- | `id`、`version` | 必需 |
59
- | `kind` | `check` 或 `planner`;可执行插件必需 |
60
- | `command` | argv 数组;`./`、`../` 开头的参数相对声明目录解析。派生插件不能声明 |
61
- | `timeout` | 超时秒数(正数);可执行插件必需 |
62
- | `base` | 派生插件:沿用该插件的 `command`;未声明 `kind`、`timeout` 时取它的值 |
63
- | `with` | 默认步骤配置,流程步骤的 `with` 逐键覆盖 |
64
- | `description` | 一句话说明,供 `sumi context` 与诊断展示 |
65
- | `triggers` | glob 数组;声明后只接收命中的文件,未命中时步骤为 `not-applicable` |
66
- | `minTier` | 低于该档位时不运行 |
67
- | `fix` | 修复命令 argv(非空),由 `sumi fix <step-id>` 以上次检查范围的文件为参数执行 |
68
- | `metrics` | `{ name, direction: lower-is-better \| higher-is-better, tolerance? }` |
69
- | `commands` | 注册到 `sumi` 的命令:`{ name, argv, description }` |
70
- | `requires` | 依赖的插件包名,必须已在项目配置 `packages` 中启用 |
71
- | `needs` | 运行前提 `{ bin?, files? }`:`node_modules/.bin` 下的可执行文件与相对仓库根的文件;`sumi init` 接入已有仓库时据此去掉不满足的步骤 |
72
- | `hooks` | `git`:git hook 名称 → 命令名;`agent.beforeTool` / `agent.afterEdit`:AI 工具调用工具前、编辑文件后运行的命令名 |
73
- | `afterInit` | 接入已有仓库后运行的 `sumi` 命令参数,例如 `[snapshot, save]` |
74
- | `instructions` | 指令主题名 → 插件包内的 Markdown 文件 |
75
- | `context` | 约束查询命令名:标准输入 `{ repoRoot, paths }`,标准输出 `{ items: [{ ref, text, source?, global?, aliases? }] }` |
57
+ 包清单还可在顶层声明 `pathHints: { testNeutral: ['openspec/**'] }`。只有启用的包参与汇总;项目配置 `pathHints.testNeutral.add/remove` 可按 glob 增删,结果在每个插件上下文的 `pathHints.testNeutral` 中。内核只汇总传递;`core/test-affected` 用它选择测试,`core/exec` 将其作为 JSON 数组 `SUMI_TEST_NEUTRAL` 传给项目脚本。它不改变其他插件收到的 `files`。这些 glob 使用 picomatch 语义并开启 `dot: true`;自定义脚本消费 `SUMI_TEST_NEUTRAL` 时也必须开启 dot,才能让 `openspec/**` 匹配 `.openspec.yaml` 等点文件。
58
+
59
+ ### 编辑后补充上下文回执
60
+
61
+ 声明 `hooks.agent.afterEdit` 的命令从 stdin 读取工具原始负载;返回成功时可向 stdout 写 `{ "additionalContext": "...", "deliveryKeys": ["规则键"] }`。入口在 Claude Code / Codex 的 PostToolUse 补充上下文确实交给模型后,才用相同命令发送回执:环境变量 `SUMI_AFTER_EDIT_DELIVERED=1`,stdin 为 `{ "originalInput": "原始负载", "keys": ["规则键"] }`。仅退出码 0 且 stdout 有模型可见上下文,或退出码 2 且 stderr 有阻断反馈时回执;普通失败或信号终止不会回执,下次编辑可重试。命令必须在任何业务逻辑之前识别回执变量;回执分支只记录 `keys`,必须幂等、无校验/修改文件等业务副作用,否则二次调用会重复执行这些动作。不需要去重的插件不要返回 `deliveryKeys`。
62
+
63
+ 声明 `hooks.agent.onPrompt` 的命令也可返回同一结果形状。统一入口只在 Claude Code / Codex 的 `UserPromptSubmit` 补充上下文已输出后回执,回执环境变量为 `SUMI_PROMPT_DELIVERED=1`,stdin 同样包含 `originalInput` 与 `keys`;插件应在回执分支只记录送达键,故障与空输出保持静默。
64
+
65
+ ### 编辑前 hook
66
+
67
+ `hooks.agent.beforeTool` 的原有字符串形式继续匹配所有受支持工具,命令执行异常时保持拒绝。需要仅匹配编辑工具且失败时放行的插件可声明对象形式:
68
+
69
+ ```yaml
70
+ hooks:
71
+ agent:
72
+ beforeTool:
73
+ command: context-before-edit
74
+ tools: edit
75
+ failure: open
76
+ when: { path: agentContext.beforeEdit, notEquals: off }
77
+ ```
78
+
79
+ `when` 按项目配置判断,未启用时不生成 hook。Claude Code 和 Codex 的 `PreToolUse` 中,命令退出码 2 且 stderr 非空才将反馈作为拒绝交给模型;成功、超时、异常或没有明确反馈均放行。命令应在确认可送达具体约束后才返回拒绝,并自行保证同会话的重试可通过。Cursor 不支持这一能力,启用时会由 `doctor` 报告。
80
+
81
+ | 字段 | 说明 |
82
+ | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
+ | `id`、`version` | 必需 |
84
+ | `kind` | `check` 或 `planner`;可执行插件必需 |
85
+ | `command` | argv 数组;`./`、`../` 开头的参数相对声明目录解析。派生插件不能声明 |
86
+ | `timeout` | 超时秒数(正数);可执行插件必需 |
87
+ | `base` | 派生插件:沿用该插件的 `command`;未声明 `kind`、`timeout` 时取它的值 |
88
+ | `with` | 默认步骤配置,流程步骤的 `with` 逐键覆盖 |
89
+ | `description` | 一句话说明,供 `sumi context` 与诊断展示 |
90
+ | `triggers` | glob 数组;声明后只接收命中的文件,未命中时步骤为 `not-applicable` |
91
+ | `minTier` | 低于该档位时不运行 |
92
+ | `fix` | 修复命令 argv(非空),由 `sumi fix <step-id>` 以上次检查范围的文件为参数执行 |
93
+ | `metrics` | `{ name, direction: lower-is-better \| higher-is-better, tolerance? }` |
94
+ | `commands` | 注册到 `sumi` 的命令:`{ name, argv, description }` |
95
+ | `requires` | 依赖的插件包名,必须已在项目配置 `packages` 中启用 |
96
+ | `needs` | 运行前提 `{ bin?, files? }`:`node_modules/.bin` 下的可执行文件与相对仓库根的文件;`sumi init` 接入已有仓库时据此去掉不满足的步骤 |
97
+ | `hooks` | `git`:git hook 名称 → 命令名;`agent.beforeTool`:命令名或带 `tools`、`failure`、`when` 的声明;`agent.afterEdit`:编辑后命令名;`agent.onPrompt`:提示词命令名或带 `when` 的声明 |
98
+ | `afterInit` | 接入已有仓库后运行的 `sumi` 命令参数,例如 `[snapshot, save]` |
99
+ | `instructions` | 指令主题名 → 插件包内的 Markdown 文件 |
100
+ | `taskTopics` | 可选的任务类型 `bug` / `feature` / `other` → 指令主题名映射;由插件决定任务流程,CLI 只按声明取用。 |
101
+ | `context` | 约束查询命令名:标准输入 `{ repoRoot, paths, intent?, kind?, issue?, change?, select?, catalog? }`,标准输出 `{ items: [{ ref, text, source?, global?, aliases?, category? }], catalog?: [{ id, description, symptoms?, source?, warning? }] }`。`catalog` 仅供宿主模型选择,`select` 由插件按 ID 精确取回;旧插件仅处理 paths 仍兼容。目录阶段不传用户提示词原文;`warning` 由 doctor 展示。 |
76
102
 
77
103
  `hooks` 与 `context` 引用的命令名必须在本插件的 `commands` 中注册。
78
104
 
@@ -8,3 +8,4 @@ export * from './process.js';
8
8
  export * from './git.js';
9
9
  export * from './tool-batches.js';
10
10
  export * from './command-args.js';
11
+ export * from './session-context.js';
@@ -8,4 +8,5 @@ export * from './process.js';
8
8
  export * from './git.js';
9
9
  export * from './tool-batches.js';
10
10
  export * from './command-args.js';
11
+ export * from './session-context.js';
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
@@ -27,6 +27,35 @@ export interface CommandDeclaration {
27
27
  argv: string[];
28
28
  description: string;
29
29
  }
30
+ /** 工具前置命令的通用接线元数据;字符串旧格式等价于 all/closed。 */
31
+ export interface BeforeToolHook {
32
+ command: string;
33
+ tools?: 'all' | 'edit';
34
+ failure?: 'closed' | 'open';
35
+ when?: {
36
+ path: string;
37
+ equals?: string;
38
+ notEquals?: string;
39
+ };
40
+ }
41
+ export interface PromptHook {
42
+ command: string;
43
+ when?: {
44
+ path: string;
45
+ equals?: string;
46
+ notEquals?: string;
47
+ };
48
+ }
49
+ /** 插件拥有的项目配置模式;适配器只负责通用校验、诊断和首次接线提示。 */
50
+ export interface AgentSetting {
51
+ path: string;
52
+ values: string[];
53
+ default: string;
54
+ event: 'beforeTool' | 'onPrompt';
55
+ group: string;
56
+ label: string;
57
+ upgradeNotice?: string;
58
+ }
30
59
  export interface PluginDeclaration {
31
60
  id: string;
32
61
  version: string;
@@ -57,15 +86,19 @@ export interface PluginDeclaration {
57
86
  git?: Record<string, string>;
58
87
  /** AI 工具调用工具前、编辑文件后与准备结束回合时运行的命令。工具原始负载经标准输入传入。 */
59
88
  agent?: {
60
- beforeTool?: string;
89
+ beforeTool?: string | BeforeToolHook;
61
90
  afterEdit?: string;
91
+ onPrompt?: string | PromptHook;
62
92
  stop?: string;
63
93
  };
64
94
  };
95
+ agentSettings?: AgentSetting[];
65
96
  /** 接入已有仓库后运行的 sumi 命令参数,例如 [snapshot, save]。 */
66
97
  afterInit?: string[];
67
98
  /** 本插件提供的动态指令:主题名 → 插件包内的指令文件(Markdown)。 */
68
99
  instructions?: Record<string, string>;
100
+ /** 任务类型到指令主题的映射;CLI 不内置具体任务流程。 */
101
+ taskTopics?: Partial<Record<'bug' | 'feature' | 'other', string>>;
69
102
  /** 一句话说明,供 sumi context 与诊断展示。 */
70
103
  description?: string;
71
104
  /** 约束查询命令(本插件注册的命令名):标准输入为 { repoRoot, paths },标准输出为 ContextResult。 */
@@ -80,10 +113,38 @@ export interface ContextItem {
80
113
  global?: boolean;
81
114
  /** 同样指向本条目的其他引用写法(例如条目所属集合的引用),规则引用其中任一即视为关联。 */
82
115
  aliases?: string[];
116
+ /** 非约束类型由提供者定义,CLI 仅分组展示。 */
117
+ category?: 'scenario' | 'known-issue' | 'workflow';
118
+ }
119
+ export interface ContextCatalogEntry {
120
+ id: string;
121
+ description: string;
122
+ symptoms?: string;
123
+ source?: string;
124
+ /** 目录提供者维护质量诊断,由 doctor 原样报告;CLI 不解释策略。 */
125
+ warning?: string;
126
+ }
127
+ export interface ContextInput {
128
+ repoRoot: string;
129
+ paths: string[];
130
+ intent?: string;
131
+ kind?: 'bug' | 'feature' | 'other';
132
+ issue?: string;
133
+ change?: string;
134
+ select?: string[];
135
+ catalog?: boolean;
83
136
  }
84
137
  export interface ContextResult {
85
138
  items: ContextItem[];
139
+ catalog?: ContextCatalogEntry[];
140
+ }
141
+ /** 编辑后命令的可选成功结果;不含工具专属包装。 */
142
+ export interface AfterEditResult {
143
+ additionalContext: string;
144
+ /** 输出确实交付后,入口回执给同一插件命令的去重键。 */
145
+ deliveryKeys?: string[];
86
146
  }
147
+ export declare function parseAfterEditResult(raw: string): AfterEditResult | null;
87
148
  export declare const HOOK_BLOCK_START = "# >>> sumi\uFF1A\u7531 sumi update \u751F\u6210\uFF0C\u8BF7\u52FF\u624B\u6539 >>>";
88
149
  export declare const HOOK_BLOCK_END = "# <<< sumi <<<";
89
150
  export declare const PROJECT_SUMI = "node ./control/bin/sumi.cjs";
@@ -182,6 +243,8 @@ export interface PluginResult {
182
243
  }
183
244
  export interface PluginContext {
184
245
  repoRoot: string;
246
+ /** 已启用插件包的路径提示,经项目配置增删后汇总;路径相对仓库根。内核只传递,不解释提示语义。 */
247
+ pathHints?: Record<string, string[]>;
185
248
  /** 基准提交 OID;null 表示空树。 */
186
249
  base: string | null;
187
250
  mode: 'worktree' | 'commit';
@@ -16,6 +16,23 @@ export function compareMetric(decl, value, base) {
16
16
  const delta = decl.direction === 'lower-is-better' ? base - value : value - base;
17
17
  return { worse: delta < -tol, better: delta > tol };
18
18
  }
19
+ export function parseAfterEditResult(raw) {
20
+ try {
21
+ const value = JSON.parse(raw);
22
+ if (!value || typeof value !== 'object' || Array.isArray(value))
23
+ return null;
24
+ const context = value.additionalContext;
25
+ if (typeof context !== 'string' || !context.trim())
26
+ return null;
27
+ const keys = value.deliveryKeys;
28
+ if (keys !== undefined && (!Array.isArray(keys) || !keys.every((key) => typeof key === 'string')))
29
+ return null;
30
+ return keys === undefined ? { additionalContext: context } : { additionalContext: context, deliveryKeys: keys };
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
19
36
  export const HOOK_BLOCK_START = '# >>> sumi:由 sumi update 生成,请勿手改 >>>';
20
37
  export const HOOK_BLOCK_END = '# <<< sumi <<<';
21
38
  export const PROJECT_SUMI = 'node ./control/bin/sumi.cjs';
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAUzB,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,OAAO,GAAsB,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC9G,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAE3G,qCAAqC;AACrC,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC;AASD,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,IAAuB,EAAE,KAAa,EAAE,IAAY;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;IACjF,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC;AACtD,CAAC;AA6DD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,6BAA6B,CAAC;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAU,CAAC;AAE7E,mDAAmD;AACnD,MAAM,UAAU,SAAS,CAAC,OAAiB,EAAE,cAAuB;IAClE,OAAO;QACL,gBAAgB;QAChB,+GAA+G;QAC/G,GAAG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB;QACtD,cAAc;KACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,OAAiB,EAAE,aAAsB;IACrE,OAAO,cAAc,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,4 @@ export declare function ruleRefPattern(): RegExp;
11
11
  /** 一行文本中的全部执行者引用。 */
12
12
  export declare function ruleRefs(text: string): RuleRef[];
13
13
  /** 读取约束查询命令的输入:标准输入上的 { repoRoot, paths }。 */
14
- export declare function readContextInput(): Promise<{
15
- repoRoot: string;
16
- paths: string[];
17
- }>;
14
+ export declare function readContextInput(): Promise<import('./protocol.js').ContextInput>;
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AASA,iCAAiC;AACjC,MAAM,UAAU,cAAc;IAC5B,OAAO,gCAAgC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,IAAI,KAAK,CAAC;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0C,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../src/rules.ts"],"names":[],"mappings":"AASA,iCAAiC;AACjC,MAAM,UAAU,cAAc;IAC5B,OAAO,gCAAgC,CAAC;AAC1C,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,IAAI,KAAK,CAAC;IACvD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ContextSessionState {
2
+ keys: string[];
3
+ deniedScopes: string[];
4
+ }
5
+ /** 兼容旧版数组状态;损坏状态返回 null,由调用方故障开放。 */
6
+ export declare function readContextSession(root: string, session: string): ContextSessionState | null;
7
+ export declare function saveContextSession(root: string, session: string, keys: string[], deniedScope?: string | string[], recoverCorrupt?: boolean): boolean;
@@ -0,0 +1,62 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ function stateFile(root, session) {
5
+ const key = createHash('sha256').update(session).digest('hex');
6
+ return join(root, '.sumi/after-edit-context', `${key}.json`);
7
+ }
8
+ /** 兼容旧版数组状态;损坏状态返回 null,由调用方故障开放。 */
9
+ export function readContextSession(root, session) {
10
+ try {
11
+ const value = JSON.parse(readFileSync(stateFile(root, session), 'utf8'));
12
+ if (Array.isArray(value) && value.every((key) => typeof key === 'string'))
13
+ return { keys: value, deniedScopes: [] };
14
+ if (!value || typeof value !== 'object' || Array.isArray(value))
15
+ return null;
16
+ const state = value;
17
+ if (!Array.isArray(state.keys) || !state.keys.every((key) => typeof key === 'string'))
18
+ return null;
19
+ if (!Array.isArray(state.deniedScopes) || !state.deniedScopes.every((key) => typeof key === 'string'))
20
+ return null;
21
+ return { keys: state.keys, deniedScopes: state.deniedScopes };
22
+ }
23
+ catch (error) {
24
+ return error.code === 'ENOENT' ? { keys: [], deniedScopes: [] } : null;
25
+ }
26
+ }
27
+ export function saveContextSession(root, session, keys, deniedScope, recoverCorrupt = false) {
28
+ try {
29
+ const old = readContextSession(root, session);
30
+ if (!old && !recoverCorrupt)
31
+ return false;
32
+ const prior = old ?? { keys: [], deniedScopes: [] };
33
+ const dir = join(root, '.sumi/after-edit-context');
34
+ mkdirSync(dir, { recursive: true });
35
+ const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
36
+ for (const name of readdirSync(dir)) {
37
+ if (!name.endsWith('.json'))
38
+ continue;
39
+ try {
40
+ if (statSync(join(dir, name)).mtimeMs < cutoff)
41
+ unlinkSync(join(dir, name));
42
+ }
43
+ catch {
44
+ /* 尽力清理 */
45
+ }
46
+ }
47
+ const file = stateFile(root, session);
48
+ const temporary = `${file}.${randomUUID()}.tmp`;
49
+ writeFileSync(temporary, JSON.stringify({
50
+ keys: [...new Set([...prior.keys, ...keys])],
51
+ deniedScopes: [
52
+ ...new Set([...prior.deniedScopes, ...(Array.isArray(deniedScope) ? deniedScope : deniedScope ? [deniedScope] : [])]),
53
+ ],
54
+ }));
55
+ renameSync(temporary, file);
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ //# sourceMappingURL=session-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-context.js","sourceRoot":"","sources":["../src/session-context.ts"],"names":[],"mappings":"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"}
@@ -81,19 +81,64 @@ export function validateDeclaration(value) {
81
81
  else if (agent !== undefined && !isObject(agent))
82
82
  errors.push('hooks.agent 必须是对象');
83
83
  else {
84
- for (const key of ['beforeTool', 'afterEdit', 'stop']) {
84
+ const before = agent?.beforeTool;
85
+ if (before !== undefined && before !== '' && !nonEmptyString(before)) {
86
+ const when = isObject(before) ? before.when : undefined;
87
+ if (!isObject(before) ||
88
+ !nonEmptyString(before.command) ||
89
+ (before.tools !== undefined && before.tools !== 'all' && before.tools !== 'edit') ||
90
+ (before.failure !== undefined && before.failure !== 'closed' && before.failure !== 'open') ||
91
+ (when !== undefined &&
92
+ (!isObject(when) || !nonEmptyString(when.path) || nonEmptyString(when.equals) === nonEmptyString(when.notEquals))) ||
93
+ Object.keys(before).some((key) => !['command', 'tools', 'failure', 'when'].includes(key)))
94
+ errors.push('hooks.agent.beforeTool 声明非法');
95
+ }
96
+ const prompt = agent?.onPrompt;
97
+ if (prompt !== undefined && !nonEmptyString(prompt)) {
98
+ const when = isObject(prompt) ? prompt.when : undefined;
99
+ if (!isObject(prompt) ||
100
+ !nonEmptyString(prompt.command) ||
101
+ (when !== undefined &&
102
+ (!isObject(when) || !nonEmptyString(when.path) || nonEmptyString(when.equals) === nonEmptyString(when.notEquals))) ||
103
+ Object.keys(prompt).some((key) => !['command', 'when'].includes(key)))
104
+ errors.push('hooks.agent.onPrompt 声明非法');
105
+ }
106
+ for (const key of ['afterEdit', 'stop']) {
85
107
  if (agent?.[key] !== undefined && !nonEmptyString(agent[key]))
86
108
  errors.push(`hooks.agent.${key} 必须是命令名`);
87
109
  }
110
+ if (before === '')
111
+ errors.push('hooks.agent.beforeTool 必须是命令名');
88
112
  }
89
113
  }
114
+ if (value.agentSettings !== undefined) {
115
+ if (!Array.isArray(value.agentSettings))
116
+ errors.push('agentSettings 必须是数组');
117
+ else
118
+ value.agentSettings.forEach((setting, i) => {
119
+ if (!isObject(setting) ||
120
+ !nonEmptyString(setting.path) ||
121
+ !Array.isArray(setting.values) ||
122
+ !setting.values.length ||
123
+ !setting.values.every(nonEmptyString) ||
124
+ !nonEmptyString(setting.default) ||
125
+ !setting.values.includes(setting.default) ||
126
+ !['beforeTool', 'onPrompt'].includes(setting.event) ||
127
+ !nonEmptyString(setting.group) ||
128
+ !nonEmptyString(setting.label) ||
129
+ (setting.upgradeNotice !== undefined && !nonEmptyString(setting.upgradeNotice)))
130
+ errors.push(`agentSettings[${i}] 声明非法`);
131
+ });
132
+ }
90
133
  // hook 与约束查询只能调用本插件注册的命令。
91
134
  {
92
135
  const hooks = (isObject(value.hooks) ? value.hooks : {});
93
136
  const git = isObject(hooks.git) ? hooks.git : {};
94
137
  const agent = (isObject(hooks.agent) ? hooks.agent : {});
95
138
  const registered = new Set(Array.isArray(value.commands) ? value.commands.map((c) => c?.name) : []);
96
- const referenced = [...Object.values(git), agent.beforeTool, agent.afterEdit, agent.stop, value.context].filter(nonEmptyString);
139
+ const before = isObject(agent.beforeTool) ? agent.beforeTool.command : agent.beforeTool;
140
+ const prompt = isObject(agent.onPrompt) ? agent.onPrompt.command : agent.onPrompt;
141
+ const referenced = [...Object.values(git), before, agent.afterEdit, prompt, agent.stop, value.context].filter(nonEmptyString);
97
142
  for (const name of referenced) {
98
143
  if (!registered.has(name))
99
144
  errors.push(`hook 或约束查询引用的命令 ${name} 未在 commands 中注册`);
@@ -102,6 +147,10 @@ export function validateDeclaration(value) {
102
147
  if (value.instructions !== undefined && (!isObject(value.instructions) || !Object.values(value.instructions).every(nonEmptyString))) {
103
148
  errors.push('instructions 必须是主题名到指令文件的映射');
104
149
  }
150
+ if (value.taskTopics !== undefined &&
151
+ (!isObject(value.taskTopics) ||
152
+ Object.entries(value.taskTopics).some(([kind, topic]) => !['bug', 'feature', 'other'].includes(kind) || !nonEmptyString(topic))))
153
+ errors.push('taskTopics 必须是 bug/feature/other 到指令主题的映射');
105
154
  if (value.afterInit !== undefined && (!isStringArray(value.afterInit) || value.afterInit.length === 0))
106
155
  errors.push('afterInit 必须是非空字符串数组');
107
156
  if (value.commands !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sumi/plugin-sdk",
3
- "version": "0.7.4",
3
+ "version": "0.7.6",
4
4
  "description": "插件协议类型与 SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -45,19 +45,21 @@ vitest related 只沿 import 图追踪。以下改动它追不到或不会整体
45
45
 
46
46
  - 配置文件:`package.json`、`tsconfig*.json`、`vite.config.*`、`vitest.config.*`(含带后缀的变体)、`vitest.workspace.*`、`vitest.projects.*`;运行器还会读出 vitest(及各 project)实际使用的配置文件及其导入的文件(vite 的 `configFileDependencies`)、`setupFiles` 与 `globalSetup` 及它们导入的本地文件,改动命中时同样全部运行。Windows 上这些路径按大小写不敏感比较。
47
47
  - 删除的文件:内核的文件列表只含存在的文件,插件用 `git diff --diff-filter=D --no-renames` 相对基准(固定提交模式为基准到被检提交)自行计算。
48
- - 非 JS/TS 文件(`?raw`、fs 读取的数据文件等)。被 `with.ignore` 匹配的文件不计入,默认 `['**/*.md']`:测试以 fs 或 `?raw` 读取 `.md` fixture 时,这些 fixture 的改动不会触发任何测试,应配置 `ignore` 只忽略文档(如 `['*.md', 'docs/**']`),不匹配 fixture。
48
+ - 非 JS/TS 文件(`?raw`、fs 读取的数据文件等)。被 `with.ignore` 或插件包的测试中立提示匹配的文件不计入,缺省含 `['**/*.md']`:测试以 fs 或 `?raw` 读取 `.md` fixture 时,这些 fixture 的改动不会触发任何测试,应配置 `ignore` 只忽略文档(如 `['*.md', 'docs/**']`),不匹配 fixture。
49
+
50
+ 默认忽略 Markdown,并合并已启用插件包清单的 `pathHints.testNeutral`:OpenSpec 包声明 `openspec/**`,判例包声明 `precedents/**`,包括 `.openspec.yaml`、JSON、图片以及归档时删除的路径。项目可在配置中用 `pathHints.testNeutral.add/remove` 增删 glob;测试步骤建议用 `with.ignore: { add: [...], remove: [...] }` 局部调整。`with.ignore` 写成数组、或显式 `default` 时会替换插件声明的中立路径,不能只为追加一条路径就改写成数组。它不改变项目 `zones`、`neutral` 或其他步骤的改动范围。若测试读取某类规格或文档,应移除对应中立 glob。`core/exec` 把汇总后的提示作为 `SUMI_TEST_NEUTRAL` JSON 数组传给自定义脚本;脚本需主动消费才会改变其测试选择。
49
51
 
50
52
  运行器无法求出相关测试(例如某个测试文件无法解析)时回退为全部运行。测试失败生成 `test-failed` finding;测试文件本身加载失败时按文件报告。
51
53
 
52
- | 配置项 | 作用 |
53
- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
54
- | `ignore` | 不影响测试的文件 glob(相对仓库根),默认 `['**/*.md']`;给出时替换默认值。workspace 模式可写成 `{ default: [...], packages: { 包名: [...] } }` 按包覆盖(见下) |
55
- | `workspaces` | 为 `true` 时按 workspace 包逐包选择(见下);默认关闭,不自动检测 |
56
- | `wholePackages` | workspace 模式:只要成为候选就整包运行的包,包名列表,或 `{ 包名: 原因 }`(原因写入 summary) |
57
- | `sourceGuards` | workspace 模式:`{ 包名: [相对包目录的测试路径] }`,本包有源码改动时追加到 related 输入,用于以 fs 或 `?raw` 读取源码做断言、import 图追不到的守卫测试 |
58
- | `rootTest` | workspace 模式:为 `false` 时根 `test` 脚本不参与(根 test 只是 `pnpm -r run test` 之类的汇总时);默认 `true` |
59
- | `attribute` | workspace 模式:把包外改动归属到包的项目命令 argv(数组,工作目录为仓库根),协议见下 |
60
- | `noPropagate` | workspace 模式:包名列表,这些包的改动不带出下游候选(只用于不被下游运行时引用的包,如只被 lint 使用的 eslint 插件包),自身仍按规则判定 |
54
+ | 配置项 | 作用 |
55
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
56
+ | `ignore` | 不影响测试的 glob,缺省为 Markdown 加插件包声明的提示;数组或显式 `default` 替换,`{ add, remove }` 增删;workspace 还可用 `packages` 按包覆盖 |
57
+ | `workspaces` | 为 `true` 时按 workspace 包逐包选择(见下);默认关闭,不自动检测 |
58
+ | `wholePackages` | workspace 模式:只要成为候选就整包运行的包,包名列表,或 `{ 包名: 原因 }`(原因写入 summary) |
59
+ | `sourceGuards` | workspace 模式:`{ 包名: [相对包目录的测试路径] }`,本包有源码改动时追加到 related 输入,用于以 fs 或 `?raw` 读取源码做断言、import 图追不到的守卫测试 |
60
+ | `rootTest` | workspace 模式:为 `false` 时根 `test` 脚本不参与(根 test 只是 `pnpm -r run test` 之类的汇总时);默认 `true` |
61
+ | `attribute` | workspace 模式:把包外改动归属到包的项目命令 argv(数组,工作目录为仓库根),协议见下 |
62
+ | `noPropagate` | workspace 模式:包名列表,这些包的改动不带出下游候选(只用于不被下游运行时引用的包,如只被 lint 使用的 eslint 插件包),自身仍按规则判定 |
61
63
 
62
64
  ### workspace 模式
63
65
 
@@ -80,8 +82,8 @@ vitest related 只沿 import 图追踪。以下改动它追不到或不会整体
80
82
  - fail-closed:命令无法启动、超时(120 秒)、非零退出、输出不是 JSON 或格式不符、返回未知包名,或配置不是非空命令数组时,全部运行并在 summary 说明原因。
81
83
  - argv 应直接运行脚本,如 `[node, control/scripts/attribute-outside.mjs]`;不要经 `pnpm exec`、`npx`、`sh -c` 等间接启动:超时只能终止直接启动的进程,间接启动时孙进程可能继续运行并拖住步骤。
82
84
  - **`noPropagate`**:这些包的改动(含被归属的包外改动)不带出下游候选,也不计入其他候选包的上游改动。只用于不被下游运行时引用的包(如只被 lint 使用的 eslint 插件):它的 `package.json` 改动(依赖、导出变化)同样不会带出下游,被下游 import 的包不应列入。
83
- - **`ignore` 按包覆盖**:`{ default: ['**/*.md'], packages: { '@app/docs': [] } }`。`default` 相对仓库根,省略时为 `['**/*.md']`;`packages` 中的包对其包内文件以该列表替换 `default`,glob 相对包目录。上例中 `@app/docs` 的 `.md` 改动按非 JS/TS 改动整包运行,其他包的 `.md` 仍被忽略。单仓模式只使用 `default`,配置了 `packages` 时 summary 提示其被忽略。
84
- - **配置校验**:`ignore` 写错(不是字符串数组或 `{ default, packages }` 对象、`default` 或 `packages` 的值不是字符串数组、含其他键、`packages` 的包名不存在于 workspace),或 `sourceGuards` 的值不是字符串数组时,结论为 `blocked` 并在 summary 指明非法项,不会丢弃非法项或退回默认忽略(那样可能漏测)。`wholePackages`、`sourceGuards`、`noPropagate` 写了不存在的包名,或 `sourceGuards` 的路径不存在时,只在 summary 中以“配置提示”给出(只会多跑或无影响,不阻塞)。
85
+ - **`ignore` 按包覆盖**:`{ packages: { '@app/docs': [] } }`。`default` 相对仓库根,省略时为 Markdown 加已启用插件包的测试中立提示;`add/remove` 对这个列表增删,显式 `default` 或数组完全替换。`packages` 中的包以相对包目录的列表替换全局列表。上例中 `@app/docs` 的 `.md` 改动按非 JS/TS 改动整包运行。单仓模式只使用全局列表,配置了 `packages` 时 summary 提示其被忽略。
86
+ - **配置校验**:`ignore` 写错(不是字符串数组或 `{ default, packages, add, remove }` 对象、列表项不是字符串、含其他键、`packages` 的包名不存在于 workspace),或 `sourceGuards` 的值不是字符串数组时,结论为 `blocked` 并在 summary 指明非法项,不会丢弃非法项或退回默认忽略(那样可能漏测)。`wholePackages`、`sourceGuards`、`noPropagate` 写了不存在的包名,或 `sourceGuards` 的路径不存在时,只在 summary 中以“配置提示”给出(只会多跑或无影响,不阻塞)。
85
87
 
86
88
  不提供整包运行的并发配置:各包按顺序运行,vitest 自身已并行执行测试文件;需要控制并发时在包的 `test` 脚本内设置。
87
89