dsh-plugin-prompt-tool 2.1.0 → 3.0.1

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 (206) hide show
  1. package/README.md +100 -233
  2. package/engine/actions/append-context.mjs +3 -24
  3. package/engine/actions/assembly.mjs +70 -94
  4. package/engine/actions/catalog.mjs +65 -28
  5. package/engine/actions/content.mjs +8 -152
  6. package/engine/actions/examples.mjs +8 -4
  7. package/engine/actions/inbox-prepend.mjs +4 -5
  8. package/engine/actions/index.mjs +17 -9
  9. package/engine/actions/inject-text.mjs +24 -4
  10. package/engine/actions/pre-step-filter.mjs +3 -4
  11. package/engine/actions/registration.mjs +20 -28
  12. package/engine/actions/request-params.mjs +21 -1
  13. package/engine/actions/shared.mjs +22 -13
  14. package/engine/actions/stream-output.mjs +26 -0
  15. package/engine/actions/tool-gate.mjs +31 -0
  16. package/engine/actions/tool-result.mjs +36 -0
  17. package/engine/actions/tool-visibility.mjs +248 -0
  18. package/engine/agent-capability.mjs +67 -0
  19. package/engine/anchor-match.mjs +14 -21
  20. package/engine/audience.d.mts +2 -0
  21. package/engine/audience.mjs +102 -0
  22. package/engine/branch.d.mts +4 -0
  23. package/engine/branch.mjs +61 -18
  24. package/engine/compaction-epoch.d.mts +25 -0
  25. package/engine/compaction-epoch.mjs +27 -4
  26. package/engine/compositions/source/local/filesystem-editor.yml +3 -3
  27. package/engine/compositions/source/local/instruction-hint.yml +2 -4
  28. package/engine/compositions/source/local/module-file-tools.yml +2 -0
  29. package/engine/compositions/source/local/module-import-tools.yml +4 -0
  30. package/engine/compositions/source/local/module-manifest-tools.yml +2 -0
  31. package/engine/compositions/source/local/module-rule-tools.yml +5 -0
  32. package/engine/compositions/source/local/module-variable-tools.yml +5 -0
  33. package/engine/compositions/source/local/present-as.yml +26 -0
  34. package/engine/compositions/source/local/tool-config-engine.yml +2 -3
  35. package/engine/compositions/source/local/tool-search.yml +11 -0
  36. package/engine/condition-facts.mjs +84 -0
  37. package/engine/conditions/anchor.mjs +63 -23
  38. package/engine/conditions/availability.mjs +1 -1
  39. package/engine/conditions/composite.mjs +3 -3
  40. package/engine/conditions/count.mjs +42 -11
  41. package/engine/conditions/evaluation.mjs +74 -19
  42. package/engine/conditions/examples.mjs +2 -1
  43. package/engine/conditions/index.d.mts +15 -0
  44. package/engine/conditions/index.mjs +23 -9
  45. package/engine/conditions/operators.mjs +4 -0
  46. package/engine/conditions/phase.mjs +9 -3
  47. package/engine/conditions/preset.mjs +1 -1
  48. package/engine/conditions/session.mjs +8 -2
  49. package/engine/conditions/subject.mjs +144 -65
  50. package/engine/conditions/text.mjs +26 -8
  51. package/engine/conditions/variable.mjs +83 -0
  52. package/engine/context-activation.d.mts +11 -0
  53. package/engine/{st-world-book.mjs → context-activation.mjs} +104 -64
  54. package/engine/delivery.d.mts +2 -0
  55. package/engine/delivery.mjs +93 -0
  56. package/engine/discovery.d.mts +38 -0
  57. package/engine/discovery.mjs +146 -0
  58. package/engine/env-safety.mjs +14 -0
  59. package/engine/executor.d.mts +28 -0
  60. package/engine/executor.mjs +290 -205
  61. package/engine/fillers.mjs +39 -8
  62. package/engine/fixed-registration.mjs +12 -0
  63. package/engine/history.mjs +71 -0
  64. package/engine/instruction-blocks.d.mts +13 -0
  65. package/engine/instruction-blocks.mjs +21 -0
  66. package/engine/instruction-files.d.mts +5 -0
  67. package/engine/instruction-files.mjs +97 -0
  68. package/engine/instruction-hint.mjs +69 -103
  69. package/engine/interpolate.d.mts +7 -0
  70. package/engine/interpolate.mjs +44 -13
  71. package/engine/layers.mjs +163 -227
  72. package/engine/machine-paths.mjs +40 -0
  73. package/engine/module-file-tools.mjs +8 -0
  74. package/engine/module-import-tools.mjs +10 -0
  75. package/engine/module-manifest-tools.mjs +8 -0
  76. package/engine/module-rule-tools.mjs +10 -0
  77. package/engine/module-variable-tools.mjs +10 -0
  78. package/engine/order.d.mts +14 -0
  79. package/engine/order.mjs +0 -3
  80. package/engine/path-safety.d.mts +2 -0
  81. package/engine/path-safety.mjs +58 -0
  82. package/engine/pre-step-source.d.mts +69 -0
  83. package/engine/pre-step-source.mjs +103 -0
  84. package/engine/present-as.mjs +77 -0
  85. package/engine/promotion-pool.d.mts +9 -0
  86. package/engine/promotion-pool.mjs +69 -0
  87. package/engine/record.mjs +2 -0
  88. package/engine/rule-engine.mjs +3 -2
  89. package/engine/rule-facts.d.mts +11 -0
  90. package/engine/rule-facts.mjs +60 -0
  91. package/engine/rule-runtime.d.mts +46 -0
  92. package/engine/rule-runtime.mjs +98 -13
  93. package/engine/rule-spec.d.mts +106 -0
  94. package/engine/rule-spec.mjs +301 -27
  95. package/engine/run-code-env.mjs +73 -19
  96. package/engine/schema.mjs +165 -243
  97. package/engine/sdk-strip.mjs +2 -2
  98. package/engine/service-names.d.mts +10 -0
  99. package/engine/service-names.mjs +10 -0
  100. package/engine/shared.d.mts +21 -0
  101. package/engine/shared.mjs +46 -13
  102. package/engine/skill-search.mjs +125 -53
  103. package/engine/source-kind.d.mts +9 -0
  104. package/engine/source-kind.mjs +16 -0
  105. package/engine/strategy-ids.mjs +5 -0
  106. package/engine/template-evaluation.d.mts +16 -0
  107. package/engine/template-evaluation.mjs +178 -0
  108. package/engine/template-frame.d.mts +16 -0
  109. package/engine/template-frame.mjs +69 -0
  110. package/engine/tool-config-engine.mjs +38 -34
  111. package/engine/tool-definition.d.mts +4 -0
  112. package/engine/tool-definition.mjs +5 -1
  113. package/engine/tool-git-bash.mjs +5 -1
  114. package/engine/tool-scope.mjs +22 -0
  115. package/engine/{dev-tool-search.mjs → tool-search.mjs} +63 -65
  116. package/engine/trigger.mjs +15 -270
  117. package/engine/vendor/yaml/dist/compose/resolve-flow-scalar.js +19 -18
  118. package/engine/vendor/yaml/dist/nodes/Alias.js +25 -23
  119. package/engine/vendor/yaml/package.json +1 -1
  120. package/lib/client.js +8312 -6724
  121. package/lib/client.js.map +1 -1
  122. package/lib/index.d.mts +16 -2120
  123. package/lib/index.mjs +26914 -5816
  124. package/modules/ponytail/module.yml +83 -203
  125. package/modules/ptc-mode/module.yml +45 -0
  126. package/modules/soul/assets/core-hard.md +6 -0
  127. package/modules/soul/assets/criteria.md +12 -0
  128. package/modules/soul/assets/echo.md +12 -0
  129. package/modules/soul/assets/layers.md +11 -0
  130. package/modules/soul/assets/ledger.md +9 -0
  131. package/modules/soul/assets/manifest.yml +20 -0
  132. package/modules/soul/assets/reference/00-layers.md +27 -0
  133. package/modules/soul/assets/reference/01-criteria.md +32 -0
  134. package/modules/soul/assets/reference/02-echo.md +161 -0
  135. package/modules/soul/assets/reference/03-vital.md +183 -0
  136. package/modules/soul/assets/reference/04-manifest.json +106 -0
  137. package/modules/soul/assets/reference/05-doctor.md +67 -0
  138. package/modules/soul/assets/reference/06-reference.md +189 -0
  139. package/modules/soul/assets/reference/07-bundle.json +431 -0
  140. package/modules/soul/assets/reference/08-/350/270/251/345/235/221/345/256/236/345/275/225.md +59 -0
  141. package/modules/soul/assets/reference/09-dev-workflow.md +109 -0
  142. package/modules/soul/assets/reference/10-echo-anatomy.md +109 -0
  143. package/modules/soul/assets/reference/11-self.md +80 -0
  144. package/modules/soul/assets/reference/12-ledger.md +159 -0
  145. package/modules/soul/assets/reference/ECHO-/346/235/203/345/250/201/345/217/243/345/276/204.md +202 -0
  146. package/modules/soul/assets/reference/ECHO/345/205/255/345/261/202/344/270/216mnemon/345/215/217/345/220/214/350/257/264/346/230/216/344/271/246.md +229 -0
  147. package/modules/soul/assets/reference/README.md +12 -0
  148. package/modules/soul/assets/templates/agents-template.md +6 -0
  149. package/modules/soul/assets/vital.md +9 -0
  150. package/modules/soul/module.yml +311 -0
  151. package/modules/superpowers/module.yml +122 -0
  152. package/modules/tool-surface/module.yml +51 -47
  153. package/package.json +37 -40
  154. package/skills/dsh-module/SKILL.md +67 -147
  155. package/skills/dsh-module/reference.md +113 -86
  156. package/templates/10-pre-step.yml +2 -3
  157. package/templates/14-first-turn-anchor.yml +10 -14
  158. package/templates/15-guide-auto.yml +32 -28
  159. package/templates/16-custom-fallback.yml +33 -21
  160. package/templates/20-system-section.yml +1 -4
  161. package/templates/50-llm-stream.yml +4 -10
  162. package/templates/60-tool-pipeline.yml +12 -10
  163. package/templates/63-append-context.yml +4 -6
  164. package/templates/65-turn-stop.yml +2 -2
  165. package/templates/67-inbox-prepend.yml +2 -2
  166. package/templates/70-subagent-maintenance.yml +9 -10
  167. package/templates/75-subagent-end.yml +2 -2
  168. package/templates/80-tool-surface.yml +41 -57
  169. package/templates/tools/40-delegate-module-import.yml +22 -0
  170. package/templates/tools/50-delegate-module-rules.yml +14 -0
  171. package/templates/tools/60-delegate-module-variables.yml +17 -0
  172. package/templates/tools/70-delegate-module-rules-edit.yml +31 -0
  173. package/engine/actions/decision.mjs +0 -54
  174. package/engine/actions/guard.mjs +0 -80
  175. package/engine/actions/sdk-strip.mjs +0 -30
  176. package/engine/character-tools.mjs +0 -8
  177. package/engine/classify-task.mjs +0 -53
  178. package/engine/compositions/source/local/character-tools.yml +0 -5
  179. package/engine/compositions/source/local/dev-tool-search.yml +0 -11
  180. package/engine/compositions/source/local/session-var-tools.yml +0 -5
  181. package/engine/compositions/source/local/subagent-tool-policy.yml +0 -21
  182. package/engine/compositions/source/local/world-book-tools.yml +0 -5
  183. package/engine/condition.mjs +0 -96
  184. package/engine/declared-triggers.mjs +0 -93
  185. package/engine/session-var-tools.mjs +0 -8
  186. package/engine/session-vars.mjs +0 -54
  187. package/engine/st-macros.d.mts +0 -22
  188. package/engine/st-macros.mjs +0 -208
  189. package/engine/st-render.mjs +0 -109
  190. package/engine/st-world-book.d.mts +0 -10
  191. package/engine/subagent-tool-policy-core.mjs +0 -400
  192. package/engine/subagent-tool-policy.mjs +0 -352
  193. package/engine/trigger-spec.mjs +0 -173
  194. package/engine/world-book-tools.mjs +0 -8
  195. package/lib/migrate-rules.d.mts +0 -1
  196. package/lib/migrate-rules.mjs +0 -610
  197. package/lib/module-package-DqJZaE71.mjs +0 -2
  198. package/lib/module-package-q2gDRu9H.mjs +0 -2869
  199. package/lib/rule-builder-DMrJten6.mjs +0 -14767
  200. package/templates/61-deny-tools-presentation.yml +0 -27
  201. package/templates/62-guard-deny-tools.yml +0 -20
  202. package/templates/policies/legacy-defaults.yml +0 -34
  203. package/templates/tools/40-delegate-character.yml +0 -15
  204. package/templates/tools/50-delegate-worldbook.yml +0 -15
  205. package/templates/tools/60-delegate-session-var.yml +0 -15
  206. package/templates/tools/70-delegate-worldbook-upsert.yml +0 -36
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-plugin-prompt-tool",
3
- "version": "2.1.0",
4
- "description": "DSH 插件:提示词工具,规范模型的思维链与回答内容,提供 Web UI 编辑 preset.md 与 AGENTS.md,并按 skills 目录注册可开关技能。",
3
+ "version": "3.0.1",
4
+ "description": "DSH 插件:提示词工具,规范模型的思维链与回答内容,提供 Web UI 编辑 module.yml 与 AGENTS.md,并按 skills 目录注册可开关技能。",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -10,9 +10,6 @@
10
10
  "type": "module",
11
11
  "main": "lib/index.mjs",
12
12
  "types": "lib/index.d.mts",
13
- "bin": {
14
- "prompt-tool-migrate-rules": "lib/migrate-rules.mjs"
15
- },
16
13
  "exports": {
17
14
  ".": {
18
15
  "types": "./lib/index.d.mts",
@@ -23,9 +20,11 @@
23
20
  "./package.json": "./package.json"
24
21
  },
25
22
  "engines": {
26
- "node": "^22.19.0 || >=24.0.0"
23
+ "node": "^22.19.0 || >=24.0.0",
24
+ "dsh": ">=0.2.0-rc.1"
27
25
  },
28
26
  "dsh": {
27
+ "manifestVersion": 1,
29
28
  "bundle": {
30
29
  "patch": "./cordis.patch.yml"
31
30
  },
@@ -62,35 +61,32 @@
62
61
  "react": "^18.2.0"
63
62
  },
64
63
  "devDependencies": {
65
- "@deepseek-ai/cordis": "4.0.4",
66
- "@deepseek-ai/dsh-agent": ">=0.2.0-rc.1",
67
- "@deepseek-ai/dsh-agent-preset-registry": ">=0.2.0-rc.1",
68
- "@deepseek-ai/dsh-api-remotes": ">=0.2.0-rc.1",
69
- "@deepseek-ai/dsh-api-session-controller": ">=0.2.0-rc.1",
70
- "@deepseek-ai/dsh-client-connection": ">=0.2.0-rc.1",
71
- "@deepseek-ai/dsh-client-locale": ">=0.2.0-rc.1",
72
- "@deepseek-ai/dsh-client-store": ">=0.2.0-rc.1",
73
- "@deepseek-ai/dsh-client-ui-layout": ">=0.2.0-rc.1",
74
- "@deepseek-ai/dsh-client-ui-settings": ">=0.2.0-rc.1",
75
- "@deepseek-ai/dsh-client-ui-settings-plugins": ">=0.2.0-rc.1",
76
- "@deepseek-ai/dsh-client-ui-renderer": ">=0.2.0-rc.1",
77
- "@deepseek-ai/dsh-client-ui-session": ">=0.2.0-rc.1",
78
- "@deepseek-ai/dsh-client-ui-workspace": ">=0.2.0-rc.1",
79
- "@deepseek-ai/dsh-client-ui-slots": ">=0.2.0-rc.1",
80
- "@deepseek-ai/dsh-commands": ">=0.2.0-rc.1",
81
- "@deepseek-ai/dsh-fs": ">=0.2.0-rc.1",
82
- "@deepseek-ai/dsh-host-webserver": ">=0.2.0-rc.1",
83
- "@deepseek-ai/dsh-llm": ">=0.2.0-rc.1",
84
- "@deepseek-ai/dsh-package-manifest": ">=0.2.0-rc.1",
85
- "@deepseek-ai/dsh-scope": ">=0.2.0-rc.1",
86
- "@deepseek-ai/dsh-session": ">=0.2.0-rc.1",
87
- "@deepseek-ai/dsh-settings": ">=0.2.0-rc.1",
88
- "@deepseek-ai/dsh-skill": ">=0.2.0-rc.1",
89
- "@deepseek-ai/dsh-skill-filesystem": ">=0.2.0-rc.1",
90
- "@deepseek-ai/dsh-subagent": ">=0.2.0-rc.1",
91
- "@deepseek-ai/dsh-system-prompt": ">=0.2.0-rc.1",
92
- "@deepseek-ai/dsh-tool-subagent": ">=0.2.0-rc.1",
93
- "@deepseek-ai/dsh-tools": ">=0.2.0-rc.1",
64
+ "@deepseek-ai/cordis": "4.0.5-alpha.1",
65
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
66
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.1-alpha.2",
67
+ "@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.2",
68
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-alpha.2",
69
+ "@deepseek-ai/dsh-client-connection": "0.2.1-alpha.2",
70
+ "@deepseek-ai/dsh-client-locale": "0.2.1-alpha.2",
71
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.1-alpha.2",
72
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.2",
73
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-alpha.2",
74
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.1-alpha.2",
75
+ "@deepseek-ai/dsh-client-ui-settings-plugins": "0.2.1-alpha.2",
76
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-alpha.2",
77
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.2",
78
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.1-alpha.2",
79
+ "@deepseek-ai/dsh-commands": "0.2.1-alpha.2",
80
+ "@deepseek-ai/dsh-fs": "0.2.1-alpha.2",
81
+ "@deepseek-ai/dsh-host-webserver": "0.2.1-alpha.2",
82
+ "@deepseek-ai/dsh-llm": "0.2.1-alpha.2",
83
+ "@deepseek-ai/dsh-scope": "0.2.1-alpha.2",
84
+ "@deepseek-ai/dsh-settings": "0.2.1-alpha.2",
85
+ "@deepseek-ai/dsh-skill": "0.2.1-alpha.2",
86
+ "@deepseek-ai/dsh-skill-filesystem": "0.2.1-alpha.2",
87
+ "@deepseek-ai/dsh-subagent": "0.2.1-alpha.2",
88
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.2",
89
+ "@deepseek-ai/dsh-tools": "0.2.1-alpha.2",
94
90
  "@types/node": "^26.2.0",
95
91
  "@types/react": "~18.3.1",
96
92
  "@types/react-dom": "^18.3.0",
@@ -116,20 +112,21 @@
116
112
  "scripts": {
117
113
  "build": "tsdown",
118
114
  "prepare": "tsdown",
119
- "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
115
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit && tsc -p tsconfig.test.json --noEmit",
120
116
  "lint": "oxlint src test tsdown.config.ts",
121
117
  "test": "node scripts/run-tests.mjs",
122
118
  "sync:yaml": "node scripts/sync-yaml-vendor.mjs",
123
- "rebuild:preset-template": "node scripts/rebuild-preset-template.mjs",
124
- "rematerialize:presets": "node scripts/rematerialize-presets.mjs",
125
- "migrate:rules": "node lib/migrate-rules.mjs",
119
+ "sync:harness": "node scripts/sync-harness-deps.mjs",
120
+ "rebuild:module-template": "node scripts/rebuild-module-template.mjs",
121
+ "rematerialize:modules": "node scripts/rematerialize-modules.mjs",
126
122
  "repair:profile": "node scripts/repair-profile.mjs",
123
+ "verify:harness": "node scripts/sync-harness-deps.mjs --check",
127
124
  "verify:host": "node scripts/verify-host-contracts.mjs",
128
125
  "verify:pack": "node scripts/verify-package.mjs"
129
126
  },
130
127
  "dependencies": {
131
128
  "@deepseek-ai/schemastery": "^3.18.4",
132
129
  "@zip.js/zip.js": "2.15.0",
133
- "yaml": "^2.9.0"
130
+ "yaml": "^2.9.1"
134
131
  }
135
132
  }
@@ -1,199 +1,119 @@
1
1
  ---
2
2
  name: dsh-module
3
- description: 给 DSH 写一个 prompt-tool 模块:一份 $DSH_HOME/.prompt-tool/modules/<id>/module.yml 定义规则(if → then)、注入正文、人设、共享参数、自定义工具与子代理策略。模块由插件在各 Agent 自己的 scope 里装配,启停只由存储根 config.yml 的启用表决定,与官方会话预设互不干涉。Use when 用户要新建/改写/审查一个模块、把规范或人设做成常驻注入、给模块配九层注入与条件动作、让模型多出工具或委派能力、把 GitHub 仓库/CLI/HTTP 服务/文档/SillyTavern 资源移植成模块、或排查模块已启用却不生效、注入没到达模型。
3
+ description: 新建、修改、审查 DSH Prompt Tool 模块,或把规则、人设、工具和 SillyTavern 来源转成原生 module.yml;也用于排查启用后未注入、将旧内部上下文/会话变量格式显式转换为原生规则。模块由插件在各 Agent scope 装配,与官方会话预设分开。
4
4
  ---
5
5
 
6
- # dsh 模块
6
+ # DSH 模块
7
7
 
8
- 最短路径:写 `$DSH_HOME/.prompt-tool/modules/<id>/module.yml` → 把 `<id>` 加进 `$DSH_HOME/.prompt-tool/config.yml` 的 `enabled` → 重启 DSH 服务。
8
+ 先确定任务是创建、编辑、审查、导入还是旧格式转换。只读审查不授予修复;用户已经授权的修改直接完成,不额外请求确认。涉及安装、启用新能力、覆盖用户文件或重启服务,遵守会话已有授权和项目边界。
9
9
 
10
- **本技能里的路径相对插件包根,不在本技能目录下**:`engine/`、`modules/`、`templates/` 都在插件包里。包名 `dsh-plugin-prompt-tool`,定位用环境变量 `$env:DSH_PROFILE_DIR`(bash 里读 `$DSH_PROFILE_DIR`),包就在它的 `node_modules/` 下。读包内文件用**文件读取工具**——Desktop 部署下包可能落在 `app.asar` 里,shell、glob、grep、node 都打不开它。找不到包时以 `reference.md` 为准,它是那些源码的摘要。
10
+ 路径基于实际 `$DSH_HOME`。模块定义为 `.prompt-tool/modules/<id>/module.yml`,启用集合在 `.prompt-tool/config.yml`。包内 `engine/`、`templates/`、`modules/` 相对插件包根,不相对本技能目录;可通过已加载插件位置或实际安装信息定位,不猜默认 profile。
11
11
 
12
- 行为写在 `module.yml` 的 `rules` 里,参数写在 `layerSettings` 里,能力段写在顶层(`persona` / `variables` / `customTools` / `subagentToolPolicy`)——`module.yml` 是唯一要编辑的文件,旁边的 `rules/` 切片由插件从它物化。
12
+ ## 1. 读取目标与所有者
13
13
 
14
- 一个模块 = 一个目录 `$DSH_HOME/.prompt-tool/modules/<id>/`,`module.yml` 是**唯一完整定义**与恢复依据。`rules/<规则id>.yml`、`rules/_settings.yml`、`rules/variables.yml` 是插件从它物化出的切片,只读;改了会被单向重切回来。
14
+ 读取完整 module.yml 与有关资产,确认目录名和 id 一致,保留用户已有修改。不要编辑 `rules/`:它是完整定义的校验投影,手改会被恢复。
15
15
 
16
- 模块不是官方预设:它不进官方预设册、不切换会话预设、也不依赖宿主扫描。装配由插件在**每个 Agent 自己的 scope** 里做,成员由存储根 `$DSH_HOME/.prompt-tool/config.yml` 的 `enabled` 列表决定。所以「这个模块装了什么」与「会话用的是哪个官方预设」是两件互不干涉的事。
17
-
18
- 先判这次做哪一种,再往下走:
19
-
20
- | 你要的效果 | 落点 |
16
+ | 内容 | 写入位置 |
21
17
  |---|---|
22
- | 把规则、规范、人设、提示词注入到某层某个时机 | 第 2~3 步(规则与层) |
23
- | 让模型多出工具、委派、内容资产、模型参数 | 第 3 步末尾补 `modules` 与能力段 |
24
- | 把外部项目(仓库/CLI/HTTP/文档/ST 资源)搬进来 | 先读第 6 步的形态表,再回到第 1 步 |
25
- | 审查一个已有模块 | 直接跳「审查已有模块」 |
18
+ | 条件、动作、正文、规则启停 | rules |
19
+ | 共享模型/能力参数 | layerSettings 的登记层 |
20
+ | 持久模块变量 | 顶层 variables |
21
+ | 全局变量 | 同一 DSH_HOME 的插件 variables.yml,经变量 owner 读写 |
22
+ | 人设正文/选项 | 各模块 persona.main / persona.subagent;rules/_settings.yml 仅作投影 |
23
+ | 主/子人设来源 | config.yml.personaSources 只存单选模块 ID,默认官方 |
24
+ | 自定义工具/子代理授权 | customTools / subagentToolPolicy |
25
+ | 模块私有文件 | memory.md、assets/(只读)、data/(只追加),经 module_file_read/append 显式读写;装配清单走 module_manifest |
26
+ | 用户指令文件 | 原文件与独立指令策略,独立授权通道 |
26
27
 
27
- **只审不改**:用户要的是判断(「这个定义对不对」「为什么没生效」)时,逐条给依据与改法就收尾——不写盘、不重启、也不顺手「修好」再报告,除非他明确让你改。
28
+ 完成判据:每处改动都有单一 owner,工具操作目标与 UI 编辑模块不混淆。
28
29
 
29
- ## 第 1 步 立文件与身份
30
+ ## 2. 创建最小规则
30
31
 
31
32
  ```yaml
32
- # $DSH_HOME/.prompt-tool/modules/my-rules/module.yml
33
- id: my-rules # 必须与目录名一致;^[a-z0-9][a-z0-9-]*$,全小写
34
- name: 我的规则
33
+ id: my-module
34
+ name: 我的模块
35
35
  version: 1.0.0
36
- engineCompat: ">=0.4.2"
37
- description: 一句话说明,只给人看
38
- modules: # 这个模块启用哪些引擎能力行
39
- - rule-engine # 声明了 rules 就要它
40
- rules: [] # 规则在这里;空模块不自动生成正文或规则
41
- ```
42
-
43
- - 先解析 `$DSH_HOME` 再动手:PowerShell 读 `$env:DSH_HOME`,bash 读 `$DSH_HOME`;它未设置时插件回落到 `~/.dsh`。别假设默认路径就是现场在用的那个,也别把模块写到别的根。
44
- - 目录建在存储根 `modules/` 下;包内 `modules/` 是启动时的补建来源(随包分发三个:`ponytail`、`tool-surface`、`skill-surface`),同名用户目录保持原样。
45
- - 顶层字段:`id` `name` `version` `engineCompat` `description` `modules` `rules` `layerSettings` `persona` `variables` `customTools` `subagentToolPolicy` `configOrder` `moduleConfigs` `meta` `order`。
46
-
47
- **完成判据**:目录名与 `id` 一致、`module.yml` 能被解析——工作台模块页能列出它(列表就是 `/meta` 的 `modules`),或只读读取接口能看到。
48
-
49
- ## 第 2 步 写规则:`if` → `then`
50
-
51
- 规则字段:`id` `name` `enabled` `layer` `group` `exclusive` `if` `then` `else`。
52
-
53
- ```yaml
36
+ modules: [rule-engine]
37
+ variables: {}
54
38
  rules:
55
- - id: my-rules-main # 稳定身份,禁用也要合法;不含 / \ : * ? " < > | 与控制字符
56
- name: 规则正文
57
- enabled: true
58
- layer: system-section
39
+ - id: project-rules
40
+ enabled: false
59
41
  then:
60
- - id: inject # 动作 id 在整条规则内唯一(含分支里的)
42
+ - id: inject
61
43
  kind: inject-text
62
44
  config:
63
45
  layer: system-section
64
46
  strategy: static
65
- order: 190
66
47
  text: |-
67
- 规则正文……
48
+ 按用户确认的项目约束执行。
68
49
  ```
69
50
 
70
- - `if` 是**只有一个键**的节点:组合算子 `all` / `any` / `not` / `notAny`,或九个谓词之一。`if` 缺省 = 无条件。九个谓词、每个的字段与语义见 `reference.md` 第一节。
71
- - `then` 非空数组;动作按数组顺序在同一执行点执行,条件只求值一次。
72
- - 分支写 `else`(承接规则级 `if` 的反面);一个动作要自己有分支,就把它写成 `{ if, then, else }` 节点嵌在 `then` / `else` 里,可继续嵌套。一个 `else` 结构上保证必有一支命中,适合「两档互斥、总得给一档」。
73
- - 互斥档位:同模块内同名非空 `group` 里任一规则写 `exclusive: true`,整组最多一条启用。切换要**先关旧档再开新档**,或由工作台显式激活目标卡(它会在一次事务里关掉同组其他卡)。
74
- - 条件拿不到必要事实时返回 `UNAVAILABLE`:只有严格 `true` 才执行。
51
+ 一条规则有独立总开关;动作 id 在整条规则的 then/else/嵌套树内唯一。if 缺省为无条件,else 必须有对应 if。条件未知时不能以“否定”为由放行。规则级 layer 是动作缺省层与展示归属,不是全局执行阶段。
75
52
 
76
- **完成判据**:模块保存成功(保存路径会用 `compileRules` 编译完整候选,不合法直接拒绝),或手动编译通过:
53
+ 条件、动作和字段选择查 [reference.md](reference.md)。工具或请求类动作有自身执行点;tool-pipeline 没有 inject-text 通道。普通文本空白保持空,不补未经请求的默认正文。
77
54
 
78
- ```powershell
79
- node --input-type=module -e "import {compileRules} from './engine/rule-spec.mjs'; import {parse} from 'yaml'; import {readFileSync} from 'node:fs'; const d=parse(readFileSync(process.argv[1],'utf8')); compileRules(d.rules ?? [])" '<module.yml 绝对路径>'
80
- ```
81
-
82
- (在仓库根执行;只做校验,不写盘。)
83
-
84
- ## 第 3 步 选层与动作
55
+ 完成判据:完整候选通过唯一 compileRules 校验,规则启停、受众、层、位置和次数符合请求。静态可解析不等于模型实际收到。
85
56
 
86
- **层是官方扩展点,不是一个管线**:九个层彼此独立,没有跨层运行顺序。规则顶层的 `layer` 只用于展示与分组,真正生效的层取**动作**里的 `config.layer`。
57
+ ## 3. 变量、人设和上下文激活
87
58
 
88
- | 层 | 真实入口 | 主要用途 |
89
- |---|---|---|
90
- | `pre-step` | `agent/pre-step` 消息批 | 每轮/首轮注入、来源过滤、按任务给子代理分档 |
91
- | `system-section` | `ctx.systemPrompt.section` | 常驻系统段;`params.complete` 可独占整个 system prompt |
92
- | `runtime-context` | `ctx.systemPrompt.context` | 动态快照(沙箱、审批、委派事实) |
93
- | `agent-request` | `agent/request` | 改模型请求参数(provider/model/temperature/maxTokens/stop) |
94
- | `llm-stream` | `llm/stream` | 包装或替代模型输出流 |
95
- | `tool-pipeline` | `tools/*` | 工具放行/拦截/改写结果 |
96
- | `turn-stop` | `agent/turn-stopping` | 命中后强制续跑一步(引擎内每轮 1 次、每会话 3 次上限) |
97
- | `subagent-start` | `subagent/start` | 向新子代理注入上下文 |
98
- | `subagent-end` | `subagent/end` | 记录或向主会话投递子代理结果 |
59
+ 普通规则引用的变量需手动在模块变量卡建立;不要扫描正文偷偷登记。空字符串是有效占位,会遮住同名全局值;删除模块键才回落全局。动作 config.variables 已退役。
99
60
 
100
- 三条容易踩的约束:
61
+ 需要赋值才声明 `params.templateEvaluation: true`,使用 `{{module.set::key::value}}` 或 module/global 的 get/add/inc/dec。一张模板只能写一个域,扫描与预览只读;禁止用 session 表或执行重挂伪装持久事务。
101
62
 
102
- 1. **层字段白名单**:`position` 用在 `pre-step`;`subject` / `match` 用在 `pre-step`、`tool-pipeline`、`turn-stop`、`subagent-start`、`subagent-end`;`audience` 用在 `pre-step`、`system-section`、`agent-request`、`tool-pipeline`。全表见 `reference.md` 第三节。
103
- 2. **注册制层的条件写在规则级 `if`**:`system-section` 与 `runtime-context` 用 `if` 表达条件(走条件文本贡献通道,每次 assembly 求值;`system-section` 配 `if.scope.audience` 是常见写法);动作级 `{ if, then, else }` 分支用在带逐轮时机的层(`pre-step` 等)。
104
- 3. **通用门写在规则级 `if`**:`audience` / `modelScope` / `promotion` / `subject` / `match` 都在规则 `if` 里;`system-section` 的静态注册 `audience` 是写在动作 `config` 里的唯一例外。
63
+ 人设正文使用模块内 persona.main/subagent;主会话和子代理各自单选来源,默认官方。来源由独立人设卡下拉选择,config.yml.personaSources 只存模块 ID,不能放正文;选择不自动启用来源模块 rules。仅取所选模块对应受众的字段,不跨模块逐字段合并。省略字段继承、空文本清空、complete:false 解除人设独占;有效官方人设与启用规则的 complete 冲突仍需配装预检。人设不进入规则数组或排序,rules/_settings.yml 的校验投影保持只读。
105
64
 
106
- 九个动作——`inject-text`、`assembly`、`decision`、`append-context`、`guard`、`sdk-strip`、`request-params`、`inbox-prepend`、`pre-step-filter`——各自的字段、执行点与失败降级见 `reference.md` 第二节。几条不写会后悔的:
65
+ 上下文激活使用 `strategy: context-activation`、`params.activation.scan: batch|history`。关键词、候选组和副键约束的语义查 reference;启停与受众仍归规则。记忆不自动生成常驻规则。
107
66
 
108
- - 工具面收窄用 `assembly.target.tools`:`allow` 是**白名单**(没点名即裁掉),`deny` 是黑名单,二者取一。配 `requireMatch: true` 让名单里任一工具缺失时整体放弃裁剪、暴露完整目录——宁可多给上下文,也不静默裁成空目录。
109
- - 把解锁做到跨请求,靠 `allowFrom: { tool, key }`:从本会话已持久化的 `tool/call` 参数里回收名单。**只能做加法**,永远解不开黑名单;它必须与发现工具成对出现,否则解锁是一次性的。
110
- - `guard` 是最终拒绝层(`assembly` 只管呈现):被它点名的工具,即使经 `run_code` 子调用也会在实际执行点被拒。它按**工具名**裁决,`run_code` 作为 PTC 的唯一入口始终可用。
111
- - 禁用或收窄某个工具要三层同做:呈现裁目录(`assembly.target.tools.deny`)、文本裁声明(`sdk-strip.mask.deny`)、执行层拒绝(`guard.mask.deny`)。`guard` 注册在 agent scope,**会话原有预设装的行也归它裁决**——这是模块禁用官方工具的硬手段;完整写法与最小 YAML 见 `reference.md` 第二节。
112
- - `pre-step-filter` 的 `sources` 是严格白名单,且同时作用于被领取的消息批:名单要**枚举全部真实 kind**——没写进去的 kind 会连同它的消息一起消失。`modules/skill-surface/module.yml` 里的 14 种 kind 就是一次实测枚举。
67
+ 完成判据:变量来源和空值语义明确,人设继承可表达,激活字段无需依赖“来自 ST”才生效。
113
68
 
114
- **完成判据**:每个动作的字段都落在该层白名单内;条件与通用门都写在规则级 `if`。
69
+ ## 4. 能力与模型工具
115
70
 
116
- ## 第 4 步 挂能力与参数
71
+ 只声明任务需要的能力。模型工具目录与能力映射如下:
117
72
 
118
- `modules` 声明这个模块启用哪些能力行;模块名就是 `engine/compositions/source/local/` 下的文件名。参数放在 `layerSettings.<层名>.<键>`,公开共享键四个:
73
+ | 能力 | 工具 |
74
+ |---|---|
75
+ | module-rule-tools | module_rules_read / module_rules_edit |
76
+ | module-variable-tools | module_variables |
77
+ | module-file-tools | module_file_read / module_file_append |
78
+ | module-manifest-tools | module_manifest |
79
+ | module-import-tools | module_import |
80
+ | tool-config-engine | customTools 声明的工具 |
119
81
 
120
- | 键 | 归属层 | 作用 |
121
- |---|---|---|
122
- | `instructionHint` | `pre-step` | 晋升后把官方指令全文换成一次路径提示(默认关) |
123
- | `maxDepth` | `subagent-start` | 已启用的插件子代理策略的递归深度 |
124
- | `toolGitBashEnabled` | `tool-pipeline` | Windows Git Bash 适配行开关 |
125
- | `customToolRequireApproval` | `tool-pipeline` | 需要用户批准的自定义执行器:shell / http / delegate / fs / ask-user |
82
+ 规则先读完整树与 revisions,再携带 expectedModuleId/expectedRevisions 编辑完整合法规则;关闭标记 settingsChanged,显式启用用 activateRuleId,删除整规则用 rule:null。正文保存不覆盖并发状态,版本冲突先重读。
126
83
 
127
- 模型与采样参数走 `agent-request` 动作的 `patch`,受众用规则的 `if.scope` 区分。
84
+ 变量先 list/get 取版本,再 set/delete;set 必须显式字符串,空串不是删除。global 写影响同一安装的所有模块。文件 append 带当前目标身份与显式 path,与规则事务分开;module_manifest 按清单只写 data/、不覆盖。module_import 先预览并完成选择,提交原始 files 与两份预览凭据,默认另存且不自动启用。
128
85
 
129
- 其余能力各有自己的顶层段,互不混写:
86
+ 共享模型/能力参数以 `ENGINE_PARAM_DEFINITIONS` 为唯一目录,使用登记的 layerSettings 路径:主/子模型路由与采样、PTC 呈现、run_code 环境、Git Bash、指令提示和工具批准都在其中;数量与 options 以源码为准,不抄旧文档的固定键数。也可通过 request-params 动作按受众改请求。官方工具、规划、压缩和普通委派来自官方预设,模块不重声明它们。
130
87
 
131
- - `persona: { prefix, suffix, complete, includeRuntimeContext }` —— 人设;`complete: true` 让它独占总个 system prompt(同一 scope 一个)。
132
- - `variables: { 名字: 值 }` —— `{{名字}}` 插值源;空字符串是**有意义的占位**,不按「空值删键」处理。局部覆盖写在动作的 `config.variables`。
133
- - `customTools: [...]` —— 自定义模型工具,五种执行器 `shell` / `http` / `delegate` / `fs` / `ask-user`;结构照 `templates/tools/*.yml` 抄。`shell` 只继承白名单环境变量(`PATH` `HOME` `USERPROFILE` `DSH_*` 等),要透传别的(token、代理)得在工具定义的 `execute.env` 里显式写。
134
- - `subagentToolPolicy: {...}` —— 子代理工具授权(`ceiling` / `profiles` / `taskRules` / `modelExpansion`);缺省时子代理按官方委派行为,不受本模块约束。
88
+ 完成判据:声明与实际工具注册一致,目标、版本、批准和取消保护没有绕过。
135
89
 
136
- **完成判据**:每个用到的能力都有对应 `modules` 行;每个 `layerSettings` 键都在上表四个之内;`persona.complete` 若为真,同 scope 内只有它一条独占段。
90
+ ## 5. 导入和显式转换
137
91
 
138
- ## 第 5 步 启用与验证
92
+ ST 预设、角色卡、世界书优先经工作台或 module_import 转换。**ST 导入自动登记缺失裸变量为空占位;普通规则不自动登记。** 导入只转换文本和声明,不执行 STscript 或任意来源代码;报告与生成后的 enabled 状态必须一起检查。
139
93
 
140
- 1. 把模块 id 加进 `$DSH_HOME/.prompt-tool/config.yml` 的 `enabled`(工作台模块页的开关也写这里),然后**重启 DSH 服务**——手改 `module.yml` 后同样要重启才加载。
141
- 2. 注入类改动逐条确认到模型真的收到:
142
- - 模块被列出且定义有效(工作台模块页 / 只读接口);
143
- - 规则编译通过(保存时的编译就是同一个 `compileRules`);
144
- - 开一个新会话,在系统消息或对话流里核对正文**真的到了模型**——「已启用」不等于「模型收到」;
145
- - 工具类改动看工具预览:自定义工具与被放行的工具确实可见,被挡的工具在 `run_code` 子调用里也被拒;
146
- - 停用一次并重启,确认贡献干净撤回(已落进会话历史的消息保留)。
147
- 3. 报告时如实区分「跑了哪些验证」与「只是静态检查」:没有真机现场证据的,就说未验证。
94
+ 用户要求转换旧内部模块时:
148
95
 
149
- **完成判据**:五条里与本次改动相关的都跑过并留下结论;没有把静态可解析当成运行时生效。
96
+ 1. 读取完整定义并保存用户同意范围内的备份;保留未知资产、记忆与来源证明。
97
+ 2. 将旧上下文策略转换为 context-activation,明确 scan;ST 数字副键映射为具名真值逻辑,不能照抄旧 any/not 注释。
98
+ 3. 将 stWorldBook 执行字段拆为 activation,把角色/位置/不支持控制项移至 source.original;模块递归声明 contextActivationRecursive。
99
+ 4. 将 set/get/add/inc/decvar 经 parser 转为 module/global 操作,启用 templateEvaluation。局部变量无冲突提升到顶层 variables,同名不同值先报告并解决;不建立第三层变量。
100
+ 5. 将旧工具与能力改为上表名称;完整规则替换保留分支与未改字段,记忆从 note 副作用分离。
101
+ 6. 将扁平 persona 明确分配到 main/subagent,保留省略/空串/false;由用户为两类受众各选择官方或一个模块来源,不因转换自动启用规则或切换来源。
102
+ 7. 旧私有记忆标记先核实并把私有内容归回 memory.md;不能单删标记后导出。
103
+ 8. 在隔离候选校验与读回,再按授权提交;失败保留原定义。
150
104
 
151
- ## 第 6 步 把外部项目做成模块
105
+ 插件不提供自动迁移器。未知宏、不等价控制或无法证明的行为要明确报告,不能把成功解析当成转换完成。
152
106
 
153
- 先判能搬哪一块——模块不执行第三方代码,能搬的是**用法**与**接口**:
107
+ ## 6. 生效与交付
154
108
 
155
- | 来源形态 | 能搬的部分 | 落在哪个能力 |
156
- |---|---|---|
157
- | 规范/方法论 | 规则文本 | `inject-text`(`system-section` 或 `pre-step`) |
158
- | CLI 工具 | 命令用法与约定 | 注入 + `customTools` 的 `shell` 执行器 |
159
- | HTTP 服务/API | 接口调用 | `customTools` 的 `http` 执行器 + 规则门控 |
160
- | 文档/手册 | 操作流程 | 技能(放进技能来源根,模型按需加载,不常驻上下文) |
161
- | 库/SDK | 只有它的命令行入口 | `shell` 执行器;安装需用户批准 |
162
- | 数据/模型 | 只能被上面几种引用 | 世界书与模块记忆 `memory.md` |
163
- | 别的 agent 平台插件/MCP | 不能直接搬 | 宿主平面,不是模块能表达的 |
109
+ 工作台保存和开关走官方插件运行更新;变量内容更新不重挂 Agent。直接手改 module.yml 的实际加载结果需通过重新读取/重建链确认。代码、bundle、patch 更新需要用户重启 DSH;不自行停止正在运行的服务。
164
110
 
165
- 挑能力时逐条问「这个来源为什么需要它」,说不出理由的能力族就别装:多装一族就多一份工具面与复杂度。**完成判据**:能一句话说出「搬哪一块、动哪几个能力、前提是什么」。
111
+ 验证以实际公共出口为准:层、位置、次数、受众、规则条件、epoch、变量写入与 disposer。读取失败、过期版本、解析拒绝不应改盘;发布失败区分已保存与尚未生效,refreshOnly 不重放写入。
166
112
 
167
- SillyTavern 预设、角色卡与世界书走工作台导入,不走手写:导入产物**就是普通模块**(同一目录、同一启用表、无角色专属存储),导入后仍要在启用表里启用才参与装配。
113
+ 在本仓库开发时遵守 AGENTS.md 的隔离 cwd 和完整 package gates。一次性探针放临时目录,永久测试须满足项目的 seam/独立真值/公共接口准入,不为退役符号写墓碑测试。
168
114
 
169
- **做不到的事要直说,别硬凑一个能跑的假实现**:
170
-
171
- | 要求 | 怎么回 |
172
- |---|---|
173
- | 「把这个仓库跑起来/复刻它的运行时」 | 模块不执行第三方代码;能做的是 shell 调它已装的 CLI,或 http 调它的服务 |
174
- | 「把依赖装上」 | 属于宿主与插件通道,需要用户批准 |
175
- | 「加一种全新工具类型/新执行器」 | 要写插件(创造模式预设 + `plugin_manager`),模块只能从既有能力里选 |
176
- | 「加一个新的引擎模块/改门控行为」 | 属于插件开发,模块只能从既有模块库选 |
177
- | 「改宿主默认行为/全局设置」 | 宿主平面;模块只作用于装了它的 Agent |
178
- | 「接一个 MCP 服务器」 | 走宿主的配置型 bundle patch |
179
- | 「把整仓塞进上下文」 | 只提炼规范与接口;整仓进上下文是 token 与权限双重失控 |
115
+ 完成判据:用户要求的改动、生效验证和失败路径已覆盖,交付明确实际运行过的检查与未验证限制。
180
116
 
181
117
  ## 审查已有模块
182
118
 
183
- 逐条核对,每条给出依据(文件与行):
184
-
185
- 1. `id` 与目录名一致、符合 `^[a-z0-9][a-z0-9-]*$`;顶层键都在第 1 步那份字段表里。
186
- 2. 规则字段是那九个;动作 id 在整条规则内唯一。
187
- 3. 每个动作的字段都在该层白名单内(回第 3 步)。
188
- 4. 条件与通用门都写在规则级 `if`。
189
- 5. 互斥组同组只有一条启用;换档说明写在 `description`(给人看),正文留给模型。
190
- 6. `layerSettings` 只用了那四个公开键。
191
- 7. 能力声明既存在又必要:`modules` 里的名字都在 `source/local/` 下;用到的 `customTools` / `subagentToolPolicy` / `persona` 都有对应声明。
192
- 8. 手改后重载过(模块在启动时读盘)。
193
- 9. `rules/` 下的切片保持原样——编辑入口是 `module.yml`。
194
-
195
- ## 相关技能
196
-
197
- - 组合行与插件行层面的细节:`editing-cordis-compositions`
198
- - 需要写新插件或新能力:`cordis-plugin-development`
199
- - 指令文件(AGENTS.md / CLAUDE.md)正文与开关:那不属于模块,见仓库的指令文件文档
119
+ 按身份、完整规则树、执行点、受众、变量 owner、共享参数归属、能力授权、人设单选来源与 complete 冲突、排序、保存版本逐项核对。纯审查只给事实与改法,不自动把发现转成修复授权。