principles-disciple 1.8.1 → 1.8.3

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 (508) hide show
  1. package/ADVANCED_CONFIG_ZH.md +97 -0
  2. package/AGENT_INSTALL.md +173 -0
  3. package/AGENT_INSTALL_EN.md +173 -0
  4. package/INSTALL.md +256 -0
  5. package/SKILL.md +63 -0
  6. package/docs/COMMAND_REFERENCE.md +76 -0
  7. package/docs/COMMAND_REFERENCE_EN.md +79 -0
  8. package/esbuild.config.js +75 -0
  9. package/openclaw.plugin.json +4 -4
  10. package/package.json +11 -13
  11. package/scripts/build-web.mjs +46 -0
  12. package/scripts/install-dependencies.cjs +47 -0
  13. package/scripts/sync-plugin.mjs +802 -0
  14. package/scripts/verify-build.mjs +109 -0
  15. package/src/agents/nocturnal-dreamer.md +152 -0
  16. package/src/agents/nocturnal-philosopher.md +138 -0
  17. package/src/agents/nocturnal-reflector.md +126 -0
  18. package/src/agents/nocturnal-scribe.md +164 -0
  19. package/src/commands/capabilities.ts +85 -0
  20. package/{dist/commands/context.js → src/commands/context.ts} +78 -38
  21. package/src/commands/evolution-status.ts +146 -0
  22. package/src/commands/export.ts +111 -0
  23. package/src/commands/focus.ts +533 -0
  24. package/src/commands/nocturnal-review.ts +311 -0
  25. package/src/commands/nocturnal-rollout.ts +763 -0
  26. package/src/commands/nocturnal-train.ts +1002 -0
  27. package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
  28. package/src/commands/principle-rollback.ts +27 -0
  29. package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
  30. package/src/commands/samples.ts +60 -0
  31. package/src/commands/strategy.ts +38 -0
  32. package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
  33. package/src/commands/workflow-debug.ts +128 -0
  34. package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
  35. package/src/config/errors.ts +163 -0
  36. package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
  37. package/src/constants/diagnostician.ts +66 -0
  38. package/src/constants/tools.ts +62 -0
  39. package/src/core/adaptive-thresholds.ts +476 -0
  40. package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
  41. package/{dist/core/config.js → src/core/config.ts} +158 -46
  42. package/src/core/control-ui-db.ts +435 -0
  43. package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
  44. package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
  45. package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
  46. package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
  47. package/src/core/empathy-keyword-matcher.ts +327 -0
  48. package/src/core/empathy-types.ts +218 -0
  49. package/src/core/event-log.ts +544 -0
  50. package/src/core/evolution-engine.ts +612 -0
  51. package/src/core/evolution-logger.ts +353 -0
  52. package/src/core/evolution-migration.ts +77 -0
  53. package/src/core/evolution-reducer.ts +731 -0
  54. package/src/core/evolution-types.ts +456 -0
  55. package/src/core/external-training-contract.ts +527 -0
  56. package/src/core/focus-history.ts +1458 -0
  57. package/src/core/hygiene/tracker.ts +117 -0
  58. package/{dist/core/init.js → src/core/init.ts} +39 -26
  59. package/src/core/local-worker-routing.ts +617 -0
  60. package/{dist/core/migration.js → src/core/migration.ts} +18 -11
  61. package/src/core/model-deployment-registry.ts +722 -0
  62. package/src/core/model-training-registry.ts +813 -0
  63. package/src/core/nocturnal-arbiter.ts +706 -0
  64. package/src/core/nocturnal-candidate-scoring.ts +392 -0
  65. package/src/core/nocturnal-compliance.ts +1075 -0
  66. package/src/core/nocturnal-dataset.ts +668 -0
  67. package/src/core/nocturnal-executability.ts +428 -0
  68. package/src/core/nocturnal-export.ts +390 -0
  69. package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
  70. package/src/core/nocturnal-trajectory-extractor.ts +484 -0
  71. package/src/core/nocturnal-trinity.ts +1384 -0
  72. package/src/core/pain.ts +122 -0
  73. package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
  74. package/{dist/core/paths.js → src/core/paths.ts} +13 -4
  75. package/src/core/principle-training-state.ts +450 -0
  76. package/src/core/profile.ts +226 -0
  77. package/src/core/promotion-gate.ts +822 -0
  78. package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
  79. package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +175 -62
  80. package/src/core/shadow-observation-registry.ts +534 -0
  81. package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
  82. package/src/core/thinking-models.ts +217 -0
  83. package/src/core/training-program.ts +630 -0
  84. package/src/core/trajectory-types.ts +243 -0
  85. package/src/core/trajectory.ts +1673 -0
  86. package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
  87. package/src/hooks/bash-risk.ts +171 -0
  88. package/src/hooks/edit-verification.ts +295 -0
  89. package/src/hooks/gate-block-helper.ts +160 -0
  90. package/src/hooks/gate.ts +210 -0
  91. package/src/hooks/gfi-gate.ts +177 -0
  92. package/src/hooks/lifecycle.ts +326 -0
  93. package/{dist/hooks/llm.js → src/hooks/llm.ts} +160 -80
  94. package/src/hooks/message-sanitize.ts +45 -0
  95. package/src/hooks/pain.ts +384 -0
  96. package/src/hooks/progressive-trust-gate.ts +174 -0
  97. package/src/hooks/prompt.ts +920 -0
  98. package/src/hooks/subagent.ts +207 -0
  99. package/src/hooks/thinking-checkpoint.ts +73 -0
  100. package/src/hooks/trajectory-collector.ts +290 -0
  101. package/src/http/principles-console-route.ts +716 -0
  102. package/src/i18n/commands.ts +117 -0
  103. package/src/index.ts +694 -0
  104. package/src/service/central-database.ts +831 -0
  105. package/src/service/control-ui-query-service.ts +888 -0
  106. package/src/service/evolution-query-service.ts +405 -0
  107. package/src/service/evolution-worker.ts +1646 -0
  108. package/src/service/health-query-service.ts +836 -0
  109. package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +235 -79
  110. package/src/service/nocturnal-service.ts +1015 -0
  111. package/src/service/nocturnal-target-selector.ts +532 -0
  112. package/src/service/phase3-input-filter.ts +237 -0
  113. package/src/service/runtime-summary-service.ts +757 -0
  114. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
  115. package/{dist/service/subagent-workflow/empathy-observer-workflow-manager.js → src/service/subagent-workflow/empathy-observer-workflow-manager.ts} +240 -117
  116. package/src/service/subagent-workflow/index.ts +51 -0
  117. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
  118. package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
  119. package/{dist/service/subagent-workflow/types.d.ts → src/service/subagent-workflow/types.ts} +137 -18
  120. package/src/service/subagent-workflow/workflow-store.ts +328 -0
  121. package/src/service/trajectory-service.ts +15 -0
  122. package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
  123. package/src/tools/deep-reflect.ts +349 -0
  124. package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
  125. package/src/types/event-types.ts +453 -0
  126. package/src/types/hygiene-types.ts +31 -0
  127. package/src/types/principle-tree-schema.ts +244 -0
  128. package/src/types/runtime-summary.ts +49 -0
  129. package/src/types.ts +74 -0
  130. package/src/utils/file-lock.ts +391 -0
  131. package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
  132. package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
  133. package/src/utils/io.ts +110 -0
  134. package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
  135. package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
  136. package/src/utils/subagent-probe.ts +94 -0
  137. package/templates/langs/en/skills/ai-sprint-orchestration/EXAMPLES.md +63 -0
  138. package/templates/langs/en/skills/ai-sprint-orchestration/REFERENCE.md +136 -0
  139. package/templates/langs/en/skills/ai-sprint-orchestration/SKILL.md +67 -0
  140. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +214 -0
  141. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +107 -0
  142. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +107 -0
  143. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +105 -0
  144. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +108 -0
  145. package/templates/langs/en/skills/ai-sprint-orchestration/references/workflow-v1-acceptance-checklist.md +58 -0
  146. package/templates/langs/en/skills/ai-sprint-orchestration/references/workflow-v1.4-work-unit-handoff.md +190 -0
  147. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -0
  148. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/archive.mjs +310 -0
  149. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/contract-enforcement.mjs +683 -0
  150. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/decision.mjs +604 -0
  151. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/state-store.mjs +32 -0
  152. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/task-specs.mjs +707 -0
  153. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +3419 -0
  154. package/templates/langs/zh/skills/ai-sprint-orchestration/EXAMPLES.md +63 -0
  155. package/templates/langs/zh/skills/ai-sprint-orchestration/REFERENCE.md +136 -0
  156. package/templates/langs/zh/skills/ai-sprint-orchestration/SKILL.md +67 -0
  157. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +214 -0
  158. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +107 -0
  159. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +107 -0
  160. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +105 -0
  161. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +108 -0
  162. package/templates/langs/zh/skills/ai-sprint-orchestration/references/workflow-v1-acceptance-checklist.md +58 -0
  163. package/templates/langs/zh/skills/ai-sprint-orchestration/references/workflow-v1.4-work-unit-handoff.md +190 -0
  164. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -0
  165. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/archive.mjs +310 -0
  166. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/contract-enforcement.mjs +683 -0
  167. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/decision.mjs +604 -0
  168. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/state-store.mjs +32 -0
  169. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/task-specs.mjs +707 -0
  170. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +3419 -0
  171. package/templates/langs/zh/skills/ai-sprint-orchestration/test/archive.test.mjs +230 -0
  172. package/templates/langs/zh/skills/ai-sprint-orchestration/test/contract-enforcement.test.mjs +672 -0
  173. package/templates/langs/zh/skills/ai-sprint-orchestration/test/decision.test.mjs +1321 -0
  174. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +1419 -0
  175. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
  176. package/templates/pain_settings.json +2 -1
  177. package/tests/README.md +120 -0
  178. package/tests/build-artifacts.test.ts +111 -0
  179. package/tests/commands/evolution-status.test.ts +222 -0
  180. package/tests/commands/evolver.test.ts +22 -0
  181. package/tests/commands/export.test.ts +78 -0
  182. package/tests/commands/nocturnal-review.test.ts +448 -0
  183. package/tests/commands/nocturnal-train.test.ts +97 -0
  184. package/tests/commands/pain.test.ts +108 -0
  185. package/tests/commands/samples.test.ts +65 -0
  186. package/tests/commands/strategy.test.ts +34 -0
  187. package/tests/commands/thinking-os.test.ts +88 -0
  188. package/tests/core/adaptive-thresholds.test.ts +261 -0
  189. package/tests/core/config-service.test.ts +89 -0
  190. package/tests/core/config.test.ts +90 -0
  191. package/tests/core/control-ui-db.test.ts +75 -0
  192. package/tests/core/core-template-guidance.test.ts +21 -0
  193. package/tests/core/detection-funnel.test.ts +63 -0
  194. package/tests/core/detection-service.test.ts +50 -0
  195. package/tests/core/dictionary-service.test.ts +116 -0
  196. package/tests/core/dictionary.test.ts +168 -0
  197. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  198. package/tests/core/event-log.test.ts +181 -0
  199. package/tests/core/evolution-e2e.test.ts +58 -0
  200. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  201. package/tests/core/evolution-engine.test.ts +562 -0
  202. package/tests/core/evolution-logger.test.ts +148 -0
  203. package/tests/core/evolution-migration.test.ts +50 -0
  204. package/tests/core/evolution-paths.test.ts +21 -0
  205. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  206. package/tests/core/evolution-reducer.test.ts +180 -0
  207. package/tests/core/evolution-types-loop.test.ts +48 -0
  208. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  209. package/tests/core/external-training-contract.test.ts +463 -0
  210. package/tests/core/focus-history.test.ts +682 -0
  211. package/tests/core/init-flatten.test.ts +69 -0
  212. package/tests/core/init-refactor.test.ts +87 -0
  213. package/tests/core/init-v1.3.test.ts +46 -0
  214. package/tests/core/init.test.ts +190 -0
  215. package/tests/core/local-worker-routing.test.ts +757 -0
  216. package/tests/core/migration.test.ts +84 -0
  217. package/tests/core/model-deployment-registry.test.ts +845 -0
  218. package/tests/core/model-training-registry.test.ts +889 -0
  219. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  220. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  221. package/tests/core/nocturnal-compliance.test.ts +646 -0
  222. package/tests/core/nocturnal-dataset.test.ts +892 -0
  223. package/tests/core/nocturnal-executability.test.ts +357 -0
  224. package/tests/core/nocturnal-export.test.ts +462 -0
  225. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  226. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  227. package/tests/core/nocturnal-trinity.test.ts +953 -0
  228. package/tests/core/pain.test.ts +33 -0
  229. package/tests/core/path-resolver.test.ts +57 -0
  230. package/tests/core/paths-refactor.test.ts +42 -0
  231. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  232. package/tests/core/principle-training-state.test.ts +712 -0
  233. package/tests/core/profile.test.ts +56 -0
  234. package/tests/core/promotion-gate.test.ts +556 -0
  235. package/tests/core/risk-calculator.test.ts +168 -0
  236. package/tests/core/session-tracker.test.ts +191 -0
  237. package/tests/core/training-program.test.ts +472 -0
  238. package/tests/core/trajectory.test.ts +265 -0
  239. package/tests/core/workspace-context-factory.test.ts +18 -0
  240. package/tests/core/workspace-context.test.ts +134 -0
  241. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  242. package/tests/fixtures/production-compatibility.test.ts +147 -0
  243. package/tests/fixtures/production-mock-generator.ts +282 -0
  244. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  245. package/tests/hooks/bash-risk.test.ts +81 -0
  246. package/tests/hooks/edit-verification.test.ts +678 -0
  247. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  248. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  249. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  250. package/tests/hooks/gate.test.ts +271 -0
  251. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  252. package/tests/hooks/gfi-gate.test.ts +669 -0
  253. package/tests/hooks/lifecycle.test.ts +248 -0
  254. package/tests/hooks/llm.test.ts +308 -0
  255. package/tests/hooks/message-sanitize.test.ts +36 -0
  256. package/tests/hooks/pain.test.ts +141 -0
  257. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  258. package/tests/hooks/prompt.test.ts +1411 -0
  259. package/tests/hooks/subagent.test.ts +467 -0
  260. package/tests/hooks/thinking-gate.test.ts +313 -0
  261. package/tests/http/principles-console-route.test.ts +140 -0
  262. package/tests/hygiene-tracker.test.ts +77 -0
  263. package/tests/index.integration.test.ts +179 -0
  264. package/tests/index.shadow-routing.integration.test.ts +140 -0
  265. package/tests/index.test.ts +9 -0
  266. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  267. package/tests/service/control-ui-query-service.test.ts +121 -0
  268. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  269. package/tests/service/evolution-worker.test.ts +585 -0
  270. package/tests/service/nocturnal-runtime.test.ts +470 -0
  271. package/tests/service/nocturnal-service.test.ts +577 -0
  272. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  273. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  274. package/tests/service/phase3-input-filter.test.ts +289 -0
  275. package/tests/service/runtime-summary-service.test.ts +919 -0
  276. package/tests/task-compliance.test.ts +166 -0
  277. package/tests/test-utils.ts +48 -0
  278. package/tests/tools/critique-prompt.test.ts +260 -0
  279. package/tests/tools/deep-reflect.test.ts +232 -0
  280. package/tests/tools/model-index.test.ts +246 -0
  281. package/tests/ui/app.test.tsx +114 -0
  282. package/tests/utils/file-lock.test.ts +407 -0
  283. package/tests/utils/hashing.test.ts +32 -0
  284. package/tests/utils/io.test.ts +39 -0
  285. package/tests/utils/nlp.test.ts +53 -0
  286. package/tests/utils/plugin-logger.test.ts +156 -0
  287. package/tsconfig.json +16 -0
  288. package/tsconfig.tsbuildinfo +1 -0
  289. package/ui/src/App.tsx +45 -0
  290. package/ui/src/api.ts +216 -0
  291. package/ui/src/charts.tsx +586 -0
  292. package/ui/src/components/ErrorState.tsx +6 -0
  293. package/ui/src/components/Loading.tsx +13 -0
  294. package/ui/src/components/ProtectedRoute.tsx +12 -0
  295. package/ui/src/components/Shell.tsx +91 -0
  296. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  297. package/ui/src/components/index.ts +5 -0
  298. package/ui/src/context/auth.tsx +80 -0
  299. package/ui/src/context/theme.tsx +66 -0
  300. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  301. package/ui/src/i18n/ui.ts +363 -0
  302. package/ui/src/main.tsx +16 -0
  303. package/ui/src/pages/EvolutionPage.tsx +352 -0
  304. package/ui/src/pages/FeedbackPage.tsx +140 -0
  305. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  306. package/ui/src/pages/LoginPage.tsx +88 -0
  307. package/ui/src/pages/OverviewPage.tsx +238 -0
  308. package/ui/src/pages/SamplesPage.tsx +174 -0
  309. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  310. package/ui/src/styles.css +1661 -0
  311. package/ui/src/types.ts +368 -0
  312. package/ui/src/utils/format.ts +15 -0
  313. package/vitest.config.ts +23 -0
  314. package/dist/commands/capabilities.d.ts +0 -3
  315. package/dist/commands/capabilities.js +0 -73
  316. package/dist/commands/context.d.ts +0 -5
  317. package/dist/commands/evolution-status.d.ts +0 -4
  318. package/dist/commands/evolution-status.js +0 -117
  319. package/dist/commands/evolver.d.ts +0 -9
  320. package/dist/commands/evolver.js +0 -26
  321. package/dist/commands/export.d.ts +0 -2
  322. package/dist/commands/export.js +0 -98
  323. package/dist/commands/focus.d.ts +0 -14
  324. package/dist/commands/focus.js +0 -457
  325. package/dist/commands/nocturnal-review.d.ts +0 -24
  326. package/dist/commands/nocturnal-review.js +0 -265
  327. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  328. package/dist/commands/nocturnal-rollout.js +0 -671
  329. package/dist/commands/nocturnal-train.d.ts +0 -25
  330. package/dist/commands/nocturnal-train.js +0 -919
  331. package/dist/commands/pain.d.ts +0 -5
  332. package/dist/commands/principle-rollback.d.ts +0 -4
  333. package/dist/commands/principle-rollback.js +0 -22
  334. package/dist/commands/rollback.d.ts +0 -19
  335. package/dist/commands/samples.d.ts +0 -2
  336. package/dist/commands/samples.js +0 -55
  337. package/dist/commands/strategy.d.ts +0 -3
  338. package/dist/commands/strategy.js +0 -29
  339. package/dist/commands/thinking-os.d.ts +0 -2
  340. package/dist/config/defaults/runtime.d.ts +0 -40
  341. package/dist/config/errors.d.ts +0 -84
  342. package/dist/config/errors.js +0 -94
  343. package/dist/config/index.js +0 -7
  344. package/dist/constants/diagnostician.d.ts +0 -12
  345. package/dist/constants/diagnostician.js +0 -56
  346. package/dist/constants/tools.d.ts +0 -17
  347. package/dist/constants/tools.js +0 -54
  348. package/dist/core/adaptive-thresholds.d.ts +0 -186
  349. package/dist/core/adaptive-thresholds.js +0 -300
  350. package/dist/core/config-service.d.ts +0 -15
  351. package/dist/core/config.d.ts +0 -129
  352. package/dist/core/control-ui-db.d.ts +0 -95
  353. package/dist/core/control-ui-db.js +0 -292
  354. package/dist/core/detection-funnel.d.ts +0 -33
  355. package/dist/core/detection-service.d.ts +0 -15
  356. package/dist/core/dictionary-service.d.ts +0 -15
  357. package/dist/core/dictionary.d.ts +0 -38
  358. package/dist/core/event-log.d.ts +0 -82
  359. package/dist/core/event-log.js +0 -463
  360. package/dist/core/evolution-engine.d.ts +0 -118
  361. package/dist/core/evolution-engine.js +0 -464
  362. package/dist/core/evolution-logger.d.ts +0 -137
  363. package/dist/core/evolution-logger.js +0 -256
  364. package/dist/core/evolution-migration.d.ts +0 -5
  365. package/dist/core/evolution-migration.js +0 -65
  366. package/dist/core/evolution-reducer.d.ts +0 -98
  367. package/dist/core/evolution-reducer.js +0 -465
  368. package/dist/core/evolution-types.d.ts +0 -287
  369. package/dist/core/evolution-types.js +0 -78
  370. package/dist/core/external-training-contract.d.ts +0 -276
  371. package/dist/core/external-training-contract.js +0 -269
  372. package/dist/core/focus-history.d.ts +0 -210
  373. package/dist/core/focus-history.js +0 -1185
  374. package/dist/core/hygiene/tracker.d.ts +0 -22
  375. package/dist/core/hygiene/tracker.js +0 -106
  376. package/dist/core/init.d.ts +0 -12
  377. package/dist/core/local-worker-routing.d.ts +0 -175
  378. package/dist/core/local-worker-routing.js +0 -525
  379. package/dist/core/migration.d.ts +0 -6
  380. package/dist/core/model-deployment-registry.d.ts +0 -218
  381. package/dist/core/model-deployment-registry.js +0 -503
  382. package/dist/core/model-training-registry.d.ts +0 -295
  383. package/dist/core/model-training-registry.js +0 -475
  384. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  385. package/dist/core/nocturnal-arbiter.js +0 -534
  386. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  387. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  388. package/dist/core/nocturnal-compliance.d.ts +0 -175
  389. package/dist/core/nocturnal-compliance.js +0 -824
  390. package/dist/core/nocturnal-dataset.d.ts +0 -224
  391. package/dist/core/nocturnal-dataset.js +0 -443
  392. package/dist/core/nocturnal-executability.d.ts +0 -85
  393. package/dist/core/nocturnal-executability.js +0 -331
  394. package/dist/core/nocturnal-export.d.ts +0 -124
  395. package/dist/core/nocturnal-export.js +0 -275
  396. package/dist/core/nocturnal-paths.d.ts +0 -124
  397. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  398. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  399. package/dist/core/nocturnal-trinity.d.ts +0 -311
  400. package/dist/core/nocturnal-trinity.js +0 -880
  401. package/dist/core/pain.d.ts +0 -4
  402. package/dist/core/pain.js +0 -70
  403. package/dist/core/path-resolver.d.ts +0 -46
  404. package/dist/core/paths.d.ts +0 -65
  405. package/dist/core/principle-training-state.d.ts +0 -121
  406. package/dist/core/principle-training-state.js +0 -321
  407. package/dist/core/profile.d.ts +0 -62
  408. package/dist/core/profile.js +0 -210
  409. package/dist/core/promotion-gate.d.ts +0 -238
  410. package/dist/core/promotion-gate.js +0 -529
  411. package/dist/core/risk-calculator.d.ts +0 -22
  412. package/dist/core/session-tracker.d.ts +0 -101
  413. package/dist/core/shadow-observation-registry.d.ts +0 -217
  414. package/dist/core/shadow-observation-registry.js +0 -308
  415. package/dist/core/system-logger.d.ts +0 -8
  416. package/dist/core/thinking-models.d.ts +0 -38
  417. package/dist/core/thinking-models.js +0 -170
  418. package/dist/core/training-program.d.ts +0 -233
  419. package/dist/core/training-program.js +0 -433
  420. package/dist/core/trajectory.d.ts +0 -411
  421. package/dist/core/trajectory.js +0 -1307
  422. package/dist/core/workspace-context.d.ts +0 -71
  423. package/dist/hooks/bash-risk.d.ts +0 -57
  424. package/dist/hooks/bash-risk.js +0 -137
  425. package/dist/hooks/edit-verification.d.ts +0 -62
  426. package/dist/hooks/edit-verification.js +0 -256
  427. package/dist/hooks/gate-block-helper.d.ts +0 -44
  428. package/dist/hooks/gate-block-helper.js +0 -119
  429. package/dist/hooks/gate.d.ts +0 -24
  430. package/dist/hooks/gate.js +0 -173
  431. package/dist/hooks/gfi-gate.d.ts +0 -40
  432. package/dist/hooks/gfi-gate.js +0 -113
  433. package/dist/hooks/lifecycle.d.ts +0 -5
  434. package/dist/hooks/lifecycle.js +0 -284
  435. package/dist/hooks/llm.d.ts +0 -13
  436. package/dist/hooks/message-sanitize.d.ts +0 -3
  437. package/dist/hooks/message-sanitize.js +0 -37
  438. package/dist/hooks/pain.d.ts +0 -5
  439. package/dist/hooks/pain.js +0 -301
  440. package/dist/hooks/progressive-trust-gate.d.ts +0 -52
  441. package/dist/hooks/progressive-trust-gate.js +0 -134
  442. package/dist/hooks/prompt.d.ts +0 -49
  443. package/dist/hooks/prompt.js +0 -905
  444. package/dist/hooks/subagent.d.ts +0 -10
  445. package/dist/hooks/subagent.js +0 -387
  446. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  447. package/dist/hooks/thinking-checkpoint.js +0 -51
  448. package/dist/hooks/trajectory-collector.d.ts +0 -32
  449. package/dist/hooks/trajectory-collector.js +0 -256
  450. package/dist/http/principles-console-route.d.ts +0 -9
  451. package/dist/http/principles-console-route.js +0 -681
  452. package/dist/i18n/commands.d.ts +0 -26
  453. package/dist/i18n/commands.js +0 -116
  454. package/dist/index.d.ts +0 -7
  455. package/dist/index.js +0 -581
  456. package/dist/service/central-database.d.ts +0 -104
  457. package/dist/service/central-database.js +0 -649
  458. package/dist/service/control-ui-query-service.d.ts +0 -221
  459. package/dist/service/control-ui-query-service.js +0 -543
  460. package/dist/service/empathy-observer-manager.d.ts +0 -88
  461. package/dist/service/empathy-observer-manager.js +0 -414
  462. package/dist/service/evolution-query-service.d.ts +0 -155
  463. package/dist/service/evolution-query-service.js +0 -258
  464. package/dist/service/evolution-worker.d.ts +0 -101
  465. package/dist/service/evolution-worker.js +0 -975
  466. package/dist/service/health-query-service.d.ts +0 -170
  467. package/dist/service/health-query-service.js +0 -662
  468. package/dist/service/nocturnal-runtime.d.ts +0 -183
  469. package/dist/service/nocturnal-service.d.ts +0 -163
  470. package/dist/service/nocturnal-service.js +0 -787
  471. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  472. package/dist/service/nocturnal-target-selector.js +0 -315
  473. package/dist/service/phase3-input-filter.d.ts +0 -73
  474. package/dist/service/phase3-input-filter.js +0 -172
  475. package/dist/service/runtime-summary-service.d.ts +0 -122
  476. package/dist/service/runtime-summary-service.js +0 -485
  477. package/dist/service/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
  478. package/dist/service/subagent-workflow/index.d.ts +0 -4
  479. package/dist/service/subagent-workflow/index.js +0 -3
  480. package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
  481. package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
  482. package/dist/service/subagent-workflow/types.js +0 -11
  483. package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
  484. package/dist/service/subagent-workflow/workflow-store.js +0 -165
  485. package/dist/service/trajectory-service.d.ts +0 -2
  486. package/dist/service/trajectory-service.js +0 -15
  487. package/dist/tools/critique-prompt.d.ts +0 -14
  488. package/dist/tools/deep-reflect.d.ts +0 -39
  489. package/dist/tools/deep-reflect.js +0 -350
  490. package/dist/tools/model-index.d.ts +0 -9
  491. package/dist/types/event-types.d.ts +0 -306
  492. package/dist/types/event-types.js +0 -106
  493. package/dist/types/hygiene-types.d.ts +0 -20
  494. package/dist/types/hygiene-types.js +0 -12
  495. package/dist/types/runtime-summary.d.ts +0 -47
  496. package/dist/types/runtime-summary.js +0 -1
  497. package/dist/types.d.ts +0 -50
  498. package/dist/types.js +0 -22
  499. package/dist/utils/file-lock.d.ts +0 -71
  500. package/dist/utils/file-lock.js +0 -309
  501. package/dist/utils/glob-match.d.ts +0 -28
  502. package/dist/utils/hashing.d.ts +0 -9
  503. package/dist/utils/io.d.ts +0 -6
  504. package/dist/utils/io.js +0 -106
  505. package/dist/utils/nlp.d.ts +0 -9
  506. package/dist/utils/plugin-logger.d.ts +0 -39
  507. package/dist/utils/subagent-probe.d.ts +0 -34
  508. package/dist/utils/subagent-probe.js +0 -81
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Task Compliance Tests
3
+ *
4
+ * Tests the validateTaskCompliance function added in P0 improvement (Pain #671cfd17)
5
+ */
6
+
7
+ import { describe, it, expect } from 'vitest';
8
+
9
+ // Note: The validateTaskCompliance logic was originally in agent-spawn.ts
10
+ // but has been removed. We test the compliance validation logic here.
11
+
12
+ function validateTaskCompliance(task: string): {
13
+ valid: boolean;
14
+ violations: string[];
15
+ warnings: string[];
16
+ } {
17
+ const violations: string[] = [];
18
+ const warnings: string[] = [];
19
+ const taskLower = task.toLowerCase();
20
+
21
+ // 检测"代劳"行为 - 违反"指导优于代劳"原则
22
+ if (taskLower.includes('为他') || taskLower.includes('代替') || taskLower.includes('帮他')) {
23
+ if (!taskLower.includes('指导') && !taskLower.includes('让他自己') && !taskLower.includes('指示')) {
24
+ violations.push(
25
+ '⚠️ 可能违反"指导优于代劳"原则:任务包含"为他/代替/帮他",但没有"指导/让他自己/指示"的表述。' +
26
+ '\n协议要求:优先指导目标智能体自己完成,而非代替执行。'
27
+ );
28
+ }
29
+ }
30
+
31
+ // 检测技能安装/修改操作 - 要求包含验证步骤
32
+ if (taskLower.includes('安装') || taskLower.includes('install') ||
33
+ taskLower.includes('删除') || taskLower.includes('delete') ||
34
+ taskLower.includes('修改') || taskLower.includes('edit') ||
35
+ taskLower.includes('创建') || taskLower.includes('create')) {
36
+ if (!taskLower.includes('验证') && !taskLower.includes('检查') &&
37
+ !taskLower.includes('确认') && !taskLower.includes('verify')) {
38
+ warnings.push(
39
+ '⚠️ 可能缺少"完成性思维":安装/修改操作应该包含"验证/检查/确认"步骤。' +
40
+ '\n协议要求:任务完成 = 执行 + 验证 + 确认'
41
+ );
42
+ }
43
+ }
44
+
45
+ return {
46
+ valid: violations.length === 0,
47
+ violations,
48
+ warnings
49
+ };
50
+ }
51
+
52
+ describe('Task Compliance Validation', () => {
53
+ describe('代劳违规检测', () => {
54
+ it('should detect "代替" without guidance', () => {
55
+ const result = validateTaskCompliance('代替Bridge安装技能X');
56
+ expect(result.valid).toBe(false);
57
+ expect(result.violations.length).toBeGreaterThan(0);
58
+ expect(result.violations[0]).toContain('指导优于代劳');
59
+ });
60
+
61
+ it('should detect "为他" without guidance', () => {
62
+ const result = validateTaskCompliance('为他安装技能X');
63
+ expect(result.valid).toBe(false);
64
+ expect(result.violations.length).toBeGreaterThan(0);
65
+ expect(result.violations[0]).toContain('指导优于代劳');
66
+ });
67
+
68
+ it('should detect "帮他" without guidance', () => {
69
+ const result = validateTaskCompliance('帮他安装技能X');
70
+ expect(result.valid).toBe(false);
71
+ expect(result.violations.length).toBeGreaterThan(0);
72
+ expect(result.violations[0]).toContain('指导优于代劳');
73
+ });
74
+
75
+ it('should allow "代替" with guidance', () => {
76
+ const result = validateTaskCompliance('指导Bridge自己安装技能X,并验证他能正常使用');
77
+ expect(result.valid).toBe(true);
78
+ expect(result.violations.length).toBe(0);
79
+ });
80
+
81
+ it('should allow "让他自己" phrasing', () => {
82
+ const result = validateTaskCompliance('指示他让他自己完成安装');
83
+ expect(result.valid).toBe(true);
84
+ expect(result.violations.length).toBe(0);
85
+ });
86
+ });
87
+
88
+ describe('验证缺失检测', () => {
89
+ it('should warn about "安装" without verification', () => {
90
+ const result = validateTaskCompliance('安装技能X');
91
+ expect(result.warnings.length).toBeGreaterThan(0);
92
+ expect(result.warnings[0]).toContain('完成性思维');
93
+ });
94
+
95
+ it('should warn about "install" without verification', () => {
96
+ const result = validateTaskCompliance('install skill X');
97
+ expect(result.warnings.length).toBeGreaterThan(0);
98
+ expect(result.warnings[0]).toContain('完成性思维');
99
+ });
100
+
101
+ it('should warn about "修改" without verification', () => {
102
+ const result = validateTaskCompliance('修改配置文件');
103
+ expect(result.warnings.length).toBeGreaterThan(0);
104
+ expect(result.warnings[0]).toContain('完成性思维');
105
+ });
106
+
107
+ it('should allow "安装" with verification', () => {
108
+ const result = validateTaskCompliance('安装技能X并验证功能');
109
+ expect(result.warnings.length).toBe(0);
110
+ });
111
+
112
+ it('should allow "修改" with check', () => {
113
+ const result = validateTaskCompliance('修改配置文件并检查结果');
114
+ expect(result.warnings.length).toBe(0);
115
+ });
116
+
117
+ it('should allow "创建" with confirm', () => {
118
+ const result = validateTaskCompliance('创建新文件并确认写入成功');
119
+ expect(result.warnings.length).toBe(0);
120
+ });
121
+ });
122
+
123
+ describe('复合场景', () => {
124
+ it('should detect both violation and warning', () => {
125
+ const result = validateTaskCompliance('代替他安装技能X');
126
+ expect(result.valid).toBe(false);
127
+ expect(result.violations.length).toBeGreaterThan(0);
128
+ expect(result.warnings.length).toBeGreaterThan(0);
129
+ });
130
+
131
+ it('should allow valid guidance task', () => {
132
+ const result = validateTaskCompliance('指导Bridge自己安装技能X,并验证安装成功');
133
+ expect(result.valid).toBe(true);
134
+ expect(result.violations.length).toBe(0);
135
+ expect(result.warnings.length).toBe(0);
136
+ });
137
+
138
+ it('should be valid for non-modification tasks', () => {
139
+ const result = validateTaskCompliance('分析代码结构,找出性能瓶颈');
140
+ expect(result.valid).toBe(true);
141
+ expect(result.violations.length).toBe(0);
142
+ expect(result.warnings.length).toBe(0);
143
+ });
144
+ });
145
+
146
+ describe('边界情况', () => {
147
+ it('should handle empty task', () => {
148
+ const result = validateTaskCompliance('');
149
+ expect(result.valid).toBe(true);
150
+ expect(result.violations.length).toBe(0);
151
+ expect(result.warnings.length).toBe(0);
152
+ });
153
+
154
+ it('should handle case-insensitive detection', () => {
155
+ const result1 = validateTaskCompliance('代替他安装');
156
+ const result2 = validateTaskCompliance('代替他安装');
157
+ expect(result1.valid).toBe(result2.valid);
158
+ });
159
+
160
+ it('should detect mixed language violations', () => {
161
+ const result = validateTaskCompliance('Help him install the skill');
162
+ // English "help him" should not trigger since we only check Chinese keywords
163
+ expect(result.valid).toBe(true); // or adjust if needed
164
+ });
165
+ });
166
+ });
@@ -0,0 +1,48 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import { WorkspaceContext } from '../src/core/workspace-context.js';
5
+
6
+ /**
7
+ * Creates a WorkspaceContext for testing purposes.
8
+ * If no workspaceDir is provided, a temporary directory is created.
9
+ */
10
+ export function createTestContext(overrides: { workspaceDir?: string, stateDir?: string } = {}): WorkspaceContext {
11
+ let workspaceDir = overrides.workspaceDir;
12
+
13
+ if (!workspaceDir) {
14
+ workspaceDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-test-'));
15
+ }
16
+
17
+ // Ensure it's absolute
18
+ workspaceDir = path.resolve(workspaceDir);
19
+
20
+ const mockCtx = {
21
+ workspaceDir,
22
+ stateDir: overrides.stateDir
23
+ };
24
+
25
+ // We use fromHookContext but bypass the cache for tests to ensure isolation
26
+ // Actually, clearCache might be better
27
+ WorkspaceContext.clearCache();
28
+ return WorkspaceContext.fromHookContext(mockCtx);
29
+ }
30
+
31
+ /**
32
+ * Safely removes a directory, ignoring Windows EPERM/ENOTEMPTY errors.
33
+ * Windows file locks can cause these errors when file handles are still held.
34
+ * The OS will eventually clean up temp directories, so it's safe to ignore.
35
+ */
36
+ export function safeRmDir(dir: string): void {
37
+ try {
38
+ if (fs.existsSync(dir)) {
39
+ fs.rmSync(dir, { recursive: true, force: true });
40
+ }
41
+ } catch (err: any) {
42
+ // On Windows, ignore EPERM/ENOTEMPTY errors (file handle still held)
43
+ // The OS will clean up temp directories eventually
44
+ if (process.platform !== 'win32' || (err?.code !== 'EPERM' && err?.code !== 'ENOTEMPTY')) {
45
+ throw err;
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,260 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+
6
+ // 导入待测试的函数
7
+ import { buildCritiquePromptV2 } from '../../src/tools/critique-prompt.js';
8
+ import type { OpenClawPluginApi } from '../../src/openclaw-sdk.js';
9
+
10
+ describe('buildCritiquePromptV2', () => {
11
+ let tempDir: string;
12
+ let mockApi: OpenClawPluginApi;
13
+
14
+ beforeEach(() => {
15
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'critique-prompt-test-'));
16
+
17
+ mockApi = {
18
+ id: "test-plugin",
19
+ name: "Test Plugin",
20
+ source: "local",
21
+ config: {},
22
+ runtime: {} as any,
23
+ logger: {
24
+ info: vi.fn(),
25
+ error: vi.fn(),
26
+ warn: vi.fn(),
27
+ debug: vi.fn(),
28
+ },
29
+ registerTool: vi.fn(),
30
+ registerHook: vi.fn(),
31
+ registerHttpRoute: vi.fn(),
32
+ registerChannel: vi.fn(),
33
+ registerGatewayMethod: vi.fn(),
34
+ registerCli: vi.fn(),
35
+ registerService: vi.fn(),
36
+ registerProvider: vi.fn(),
37
+ registerCommand: vi.fn(),
38
+ resolvePath: vi.fn(),
39
+ on: vi.fn(),
40
+ } as unknown as OpenClawPluginApi;
41
+ });
42
+
43
+ afterEach(() => {
44
+ fs.rmSync(tempDir, { recursive: true, force: true });
45
+ });
46
+
47
+ describe('基本结构', () => {
48
+ it('应包含 "Critical Analysis Engine" 标识', () => {
49
+ const result = buildCritiquePromptV2({
50
+ context: '测试上下文',
51
+ workspaceDir: tempDir,
52
+ });
53
+
54
+ expect(result).toContain('Critical Analysis Engine');
55
+ });
56
+
57
+ it('应包含用户上下文', () => {
58
+ const result = buildCritiquePromptV2({
59
+ context: '这是一个关于营销策略的计划',
60
+ workspaceDir: tempDir,
61
+ });
62
+
63
+ expect(result).toContain('这是一个关于营销策略的计划');
64
+ });
65
+ });
66
+
67
+ describe('元认知模型说明', () => {
68
+ it('应说明元认知模型已继承,不应重复列出 T-01 到 T-09', () => {
69
+ const result = buildCritiquePromptV2({
70
+ context: '测试',
71
+ workspaceDir: tempDir,
72
+ });
73
+
74
+ // 应包含继承说明
75
+ expect(result).toContain('Meta-Cognitive Models');
76
+ expect(result).toContain('inherited');
77
+ expect(result).toContain('thinking_os');
78
+
79
+ // 不应重复列出具体的元认知模型
80
+ expect(result).not.toContain('T-01: Map Before Territory');
81
+ expect(result).not.toContain('T-02: Constraints as Lighthouses');
82
+ expect(result).not.toContain('T-09: Divide and Conquer');
83
+ });
84
+ });
85
+
86
+ describe('模型选择指南', () => {
87
+ it('应包含 Step 1/2/3 选择指南', () => {
88
+ const result = buildCritiquePromptV2({
89
+ context: '测试',
90
+ workspaceDir: tempDir,
91
+ });
92
+
93
+ expect(result).toContain('Model Selection Guidelines');
94
+ expect(result).toContain('Step 1');
95
+ expect(result).toContain('Step 2');
96
+ expect(result).toContain('Step 3');
97
+ });
98
+
99
+ it('Step 1 应包含任务类型判断指导', () => {
100
+ const result = buildCritiquePromptV2({
101
+ context: '测试',
102
+ workspaceDir: tempDir,
103
+ });
104
+
105
+ expect(result).toContain('general planning');
106
+ expect(result).toContain('domain-specific');
107
+ });
108
+
109
+ it('Step 3 应包含 Fallback 说明', () => {
110
+ const result = buildCritiquePromptV2({
111
+ context: '测试',
112
+ workspaceDir: tempDir,
113
+ });
114
+
115
+ expect(result).toContain('Fallback');
116
+ expect(result).toContain('Meta-Cognitive Models');
117
+ });
118
+ });
119
+
120
+ describe('模型索引注入', () => {
121
+ it('当有索引文件时,应注入索引内容', () => {
122
+ const modelsDir = path.join(tempDir, '.principles', 'models');
123
+ fs.mkdirSync(modelsDir, { recursive: true });
124
+
125
+ const indexContent = `# 扩展思维模型索引
126
+
127
+ | ID | 名称 | 适用场景 |
128
+ |----|------|----------|
129
+ | MARKETING_4P | 营销4P | 营销策略 |
130
+ `;
131
+ fs.writeFileSync(path.join(modelsDir, '_INDEX.md'), indexContent);
132
+
133
+ const result = buildCritiquePromptV2({
134
+ context: '测试',
135
+ workspaceDir: tempDir,
136
+ });
137
+
138
+ expect(result).toContain('Domain-Specific Models');
139
+ expect(result).toContain('MARKETING_4P');
140
+ });
141
+
142
+ it('当无索引文件时,应显示默认消息', () => {
143
+ const result = buildCritiquePromptV2({
144
+ context: '测试',
145
+ workspaceDir: tempDir,
146
+ });
147
+
148
+ expect(result).toContain('暂无扩展思维模型');
149
+ });
150
+ });
151
+
152
+ describe('深度指令', () => {
153
+ it('depth=1 时应使用轻量分析指令', () => {
154
+ const result = buildCritiquePromptV2({
155
+ context: '测试',
156
+ workspaceDir: tempDir,
157
+ depth: 1,
158
+ });
159
+
160
+ expect(result).toContain('quick');
161
+ });
162
+
163
+ it('depth=2 时应使用平衡分析指令', () => {
164
+ const result = buildCritiquePromptV2({
165
+ context: '测试',
166
+ workspaceDir: tempDir,
167
+ depth: 2,
168
+ });
169
+
170
+ expect(result).toContain('balanced');
171
+ });
172
+
173
+ it('depth=3 时应使用详尽分析指令', () => {
174
+ const result = buildCritiquePromptV2({
175
+ context: '测试',
176
+ workspaceDir: tempDir,
177
+ depth: 3,
178
+ });
179
+
180
+ expect(result).toContain('thorough');
181
+ });
182
+
183
+ it('默认 depth 应为 2', () => {
184
+ const result = buildCritiquePromptV2({
185
+ context: '测试',
186
+ workspaceDir: tempDir,
187
+ // 不指定 depth
188
+ });
189
+
190
+ expect(result).toContain('balanced');
191
+ });
192
+ });
193
+
194
+ describe('深度边界值验证', () => {
195
+ it('depth=0 时应 fallback 到 2 并输出警告', () => {
196
+ const result = buildCritiquePromptV2({
197
+ context: '测试',
198
+ workspaceDir: tempDir,
199
+ depth: 0,
200
+ api: mockApi,
201
+ });
202
+
203
+ expect(result).toContain('balanced');
204
+ expect(mockApi.logger!.warn).toHaveBeenCalledWith(
205
+ expect.stringContaining('Invalid depth value 0')
206
+ );
207
+ });
208
+
209
+ it('depth=4 时应 fallback 到 2 并输出警告', () => {
210
+ const result = buildCritiquePromptV2({
211
+ context: '测试',
212
+ workspaceDir: tempDir,
213
+ depth: 4,
214
+ api: mockApi,
215
+ });
216
+
217
+ expect(result).toContain('balanced');
218
+ expect(mockApi.logger!.warn).toHaveBeenCalledWith(
219
+ expect.stringContaining('Invalid depth value 4')
220
+ );
221
+ });
222
+
223
+ it('depth=-1 时应 fallback 到 2', () => {
224
+ const result = buildCritiquePromptV2({
225
+ context: '测试',
226
+ workspaceDir: tempDir,
227
+ depth: -1,
228
+ api: mockApi,
229
+ });
230
+
231
+ expect(result).toContain('balanced');
232
+ });
233
+
234
+ it('depth=999 时应 fallback 到 2', () => {
235
+ const result = buildCritiquePromptV2({
236
+ context: '测试',
237
+ workspaceDir: tempDir,
238
+ depth: 999,
239
+ api: mockApi,
240
+ });
241
+
242
+ expect(result).toContain('balanced');
243
+ });
244
+ });
245
+
246
+ describe('输出结构', () => {
247
+ it('应包含要求的输出结构', () => {
248
+ const result = buildCritiquePromptV2({
249
+ context: '测试',
250
+ workspaceDir: tempDir,
251
+ });
252
+
253
+ expect(result).toContain('Blind Spots');
254
+ expect(result).toContain('Risk Warnings');
255
+ expect(result).toContain('Alternative Approaches');
256
+ expect(result).toContain('Recommendations');
257
+ expect(result).toContain('Confidence Level');
258
+ });
259
+ });
260
+ });