principles-disciple 1.8.0 → 1.8.2

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 (460) 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 +6 -1
  10. package/package.json +13 -15
  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} +185 -63
  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} +166 -139
  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} +263 -36
  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/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +603 -0
  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/src/service/subagent-workflow/types.ts +378 -0
  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/zh/skills/pd-diagnostician/SKILL.md +70 -1
  138. package/templates/pain_settings.json +2 -1
  139. package/tests/README.md +120 -0
  140. package/tests/build-artifacts.test.ts +111 -0
  141. package/tests/commands/evolution-status.test.ts +222 -0
  142. package/tests/commands/evolver.test.ts +22 -0
  143. package/tests/commands/export.test.ts +78 -0
  144. package/tests/commands/nocturnal-review.test.ts +448 -0
  145. package/tests/commands/nocturnal-train.test.ts +97 -0
  146. package/tests/commands/pain.test.ts +108 -0
  147. package/tests/commands/samples.test.ts +65 -0
  148. package/tests/commands/strategy.test.ts +34 -0
  149. package/tests/commands/thinking-os.test.ts +88 -0
  150. package/tests/core/adaptive-thresholds.test.ts +261 -0
  151. package/tests/core/config-service.test.ts +89 -0
  152. package/tests/core/config.test.ts +90 -0
  153. package/tests/core/control-ui-db.test.ts +75 -0
  154. package/tests/core/core-template-guidance.test.ts +21 -0
  155. package/tests/core/detection-funnel.test.ts +63 -0
  156. package/tests/core/detection-service.test.ts +50 -0
  157. package/tests/core/dictionary-service.test.ts +116 -0
  158. package/tests/core/dictionary.test.ts +168 -0
  159. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  160. package/tests/core/event-log.test.ts +181 -0
  161. package/tests/core/evolution-e2e.test.ts +58 -0
  162. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  163. package/tests/core/evolution-engine.test.ts +562 -0
  164. package/tests/core/evolution-logger.test.ts +148 -0
  165. package/tests/core/evolution-migration.test.ts +50 -0
  166. package/tests/core/evolution-paths.test.ts +21 -0
  167. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  168. package/tests/core/evolution-reducer.test.ts +180 -0
  169. package/tests/core/evolution-types-loop.test.ts +48 -0
  170. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  171. package/tests/core/external-training-contract.test.ts +463 -0
  172. package/tests/core/focus-history.test.ts +682 -0
  173. package/tests/core/init-flatten.test.ts +69 -0
  174. package/tests/core/init-refactor.test.ts +87 -0
  175. package/tests/core/init-v1.3.test.ts +46 -0
  176. package/tests/core/init.test.ts +190 -0
  177. package/tests/core/local-worker-routing.test.ts +757 -0
  178. package/tests/core/migration.test.ts +84 -0
  179. package/tests/core/model-deployment-registry.test.ts +845 -0
  180. package/tests/core/model-training-registry.test.ts +889 -0
  181. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  182. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  183. package/tests/core/nocturnal-compliance.test.ts +646 -0
  184. package/tests/core/nocturnal-dataset.test.ts +892 -0
  185. package/tests/core/nocturnal-executability.test.ts +357 -0
  186. package/tests/core/nocturnal-export.test.ts +462 -0
  187. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  188. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  189. package/tests/core/nocturnal-trinity.test.ts +953 -0
  190. package/tests/core/pain.test.ts +33 -0
  191. package/tests/core/path-resolver.test.ts +57 -0
  192. package/tests/core/paths-refactor.test.ts +42 -0
  193. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  194. package/tests/core/principle-training-state.test.ts +712 -0
  195. package/tests/core/profile.test.ts +56 -0
  196. package/tests/core/promotion-gate.test.ts +556 -0
  197. package/tests/core/risk-calculator.test.ts +168 -0
  198. package/tests/core/session-tracker.test.ts +191 -0
  199. package/tests/core/training-program.test.ts +472 -0
  200. package/tests/core/trajectory.test.ts +265 -0
  201. package/tests/core/workspace-context-factory.test.ts +18 -0
  202. package/tests/core/workspace-context.test.ts +134 -0
  203. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  204. package/tests/fixtures/production-compatibility.test.ts +147 -0
  205. package/tests/fixtures/production-mock-generator.ts +282 -0
  206. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  207. package/tests/hooks/bash-risk.test.ts +81 -0
  208. package/tests/hooks/edit-verification.test.ts +678 -0
  209. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  210. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  211. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  212. package/tests/hooks/gate.test.ts +271 -0
  213. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  214. package/tests/hooks/gfi-gate.test.ts +669 -0
  215. package/tests/hooks/lifecycle.test.ts +248 -0
  216. package/tests/hooks/llm.test.ts +308 -0
  217. package/tests/hooks/message-sanitize.test.ts +36 -0
  218. package/tests/hooks/pain.test.ts +141 -0
  219. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  220. package/tests/hooks/prompt.test.ts +1411 -0
  221. package/tests/hooks/subagent.test.ts +467 -0
  222. package/tests/hooks/thinking-gate.test.ts +313 -0
  223. package/tests/http/principles-console-route.test.ts +140 -0
  224. package/tests/hygiene-tracker.test.ts +77 -0
  225. package/tests/index.integration.test.ts +179 -0
  226. package/tests/index.shadow-routing.integration.test.ts +140 -0
  227. package/tests/index.test.ts +9 -0
  228. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  229. package/tests/service/control-ui-query-service.test.ts +121 -0
  230. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  231. package/tests/service/evolution-worker.test.ts +585 -0
  232. package/tests/service/nocturnal-runtime.test.ts +470 -0
  233. package/tests/service/nocturnal-service.test.ts +577 -0
  234. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  235. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  236. package/tests/service/phase3-input-filter.test.ts +289 -0
  237. package/tests/service/runtime-summary-service.test.ts +919 -0
  238. package/tests/task-compliance.test.ts +166 -0
  239. package/tests/test-utils.ts +48 -0
  240. package/tests/tools/critique-prompt.test.ts +260 -0
  241. package/tests/tools/deep-reflect.test.ts +232 -0
  242. package/tests/tools/model-index.test.ts +246 -0
  243. package/tests/ui/app.test.tsx +114 -0
  244. package/tests/utils/file-lock.test.ts +407 -0
  245. package/tests/utils/hashing.test.ts +32 -0
  246. package/tests/utils/io.test.ts +39 -0
  247. package/tests/utils/nlp.test.ts +53 -0
  248. package/tests/utils/plugin-logger.test.ts +156 -0
  249. package/tsconfig.json +16 -0
  250. package/tsconfig.tsbuildinfo +1 -0
  251. package/ui/src/App.tsx +45 -0
  252. package/ui/src/api.ts +216 -0
  253. package/ui/src/charts.tsx +586 -0
  254. package/ui/src/components/ErrorState.tsx +6 -0
  255. package/ui/src/components/Loading.tsx +13 -0
  256. package/ui/src/components/ProtectedRoute.tsx +12 -0
  257. package/ui/src/components/Shell.tsx +91 -0
  258. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  259. package/ui/src/components/index.ts +5 -0
  260. package/ui/src/context/auth.tsx +80 -0
  261. package/ui/src/context/theme.tsx +66 -0
  262. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  263. package/ui/src/i18n/ui.ts +363 -0
  264. package/ui/src/main.tsx +16 -0
  265. package/ui/src/pages/EvolutionPage.tsx +352 -0
  266. package/ui/src/pages/FeedbackPage.tsx +140 -0
  267. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  268. package/ui/src/pages/LoginPage.tsx +88 -0
  269. package/ui/src/pages/OverviewPage.tsx +238 -0
  270. package/ui/src/pages/SamplesPage.tsx +174 -0
  271. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  272. package/ui/src/styles.css +1661 -0
  273. package/ui/src/types.ts +368 -0
  274. package/ui/src/utils/format.ts +15 -0
  275. package/vitest.config.ts +23 -0
  276. package/dist/commands/capabilities.d.ts +0 -3
  277. package/dist/commands/capabilities.js +0 -73
  278. package/dist/commands/context.d.ts +0 -5
  279. package/dist/commands/evolution-status.d.ts +0 -4
  280. package/dist/commands/evolution-status.js +0 -117
  281. package/dist/commands/evolver.d.ts +0 -9
  282. package/dist/commands/evolver.js +0 -26
  283. package/dist/commands/export.d.ts +0 -2
  284. package/dist/commands/export.js +0 -98
  285. package/dist/commands/focus.d.ts +0 -14
  286. package/dist/commands/focus.js +0 -457
  287. package/dist/commands/nocturnal-review.d.ts +0 -24
  288. package/dist/commands/nocturnal-review.js +0 -265
  289. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  290. package/dist/commands/nocturnal-rollout.js +0 -671
  291. package/dist/commands/nocturnal-train.d.ts +0 -25
  292. package/dist/commands/nocturnal-train.js +0 -919
  293. package/dist/commands/pain.d.ts +0 -5
  294. package/dist/commands/principle-rollback.d.ts +0 -4
  295. package/dist/commands/principle-rollback.js +0 -22
  296. package/dist/commands/rollback.d.ts +0 -19
  297. package/dist/commands/samples.d.ts +0 -2
  298. package/dist/commands/samples.js +0 -55
  299. package/dist/commands/strategy.d.ts +0 -3
  300. package/dist/commands/strategy.js +0 -29
  301. package/dist/commands/thinking-os.d.ts +0 -2
  302. package/dist/config/defaults/runtime.d.ts +0 -40
  303. package/dist/config/errors.d.ts +0 -84
  304. package/dist/config/errors.js +0 -94
  305. package/dist/config/index.js +0 -7
  306. package/dist/constants/diagnostician.d.ts +0 -12
  307. package/dist/constants/diagnostician.js +0 -56
  308. package/dist/constants/tools.d.ts +0 -17
  309. package/dist/constants/tools.js +0 -54
  310. package/dist/core/adaptive-thresholds.d.ts +0 -186
  311. package/dist/core/adaptive-thresholds.js +0 -300
  312. package/dist/core/config-service.d.ts +0 -15
  313. package/dist/core/config.d.ts +0 -127
  314. package/dist/core/control-ui-db.d.ts +0 -95
  315. package/dist/core/control-ui-db.js +0 -292
  316. package/dist/core/detection-funnel.d.ts +0 -33
  317. package/dist/core/detection-service.d.ts +0 -15
  318. package/dist/core/dictionary-service.d.ts +0 -15
  319. package/dist/core/dictionary.d.ts +0 -38
  320. package/dist/core/event-log.d.ts +0 -82
  321. package/dist/core/event-log.js +0 -463
  322. package/dist/core/evolution-engine.d.ts +0 -118
  323. package/dist/core/evolution-engine.js +0 -464
  324. package/dist/core/evolution-logger.d.ts +0 -137
  325. package/dist/core/evolution-logger.js +0 -256
  326. package/dist/core/evolution-migration.d.ts +0 -5
  327. package/dist/core/evolution-migration.js +0 -65
  328. package/dist/core/evolution-reducer.d.ts +0 -98
  329. package/dist/core/evolution-reducer.js +0 -465
  330. package/dist/core/evolution-types.d.ts +0 -287
  331. package/dist/core/evolution-types.js +0 -78
  332. package/dist/core/external-training-contract.d.ts +0 -276
  333. package/dist/core/external-training-contract.js +0 -269
  334. package/dist/core/focus-history.d.ts +0 -210
  335. package/dist/core/focus-history.js +0 -1185
  336. package/dist/core/hygiene/tracker.d.ts +0 -22
  337. package/dist/core/hygiene/tracker.js +0 -106
  338. package/dist/core/init.d.ts +0 -12
  339. package/dist/core/local-worker-routing.d.ts +0 -175
  340. package/dist/core/local-worker-routing.js +0 -525
  341. package/dist/core/migration.d.ts +0 -6
  342. package/dist/core/model-deployment-registry.d.ts +0 -218
  343. package/dist/core/model-deployment-registry.js +0 -503
  344. package/dist/core/model-training-registry.d.ts +0 -295
  345. package/dist/core/model-training-registry.js +0 -475
  346. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  347. package/dist/core/nocturnal-arbiter.js +0 -534
  348. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  349. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  350. package/dist/core/nocturnal-compliance.d.ts +0 -175
  351. package/dist/core/nocturnal-compliance.js +0 -824
  352. package/dist/core/nocturnal-dataset.d.ts +0 -224
  353. package/dist/core/nocturnal-dataset.js +0 -443
  354. package/dist/core/nocturnal-executability.d.ts +0 -85
  355. package/dist/core/nocturnal-executability.js +0 -331
  356. package/dist/core/nocturnal-export.d.ts +0 -124
  357. package/dist/core/nocturnal-export.js +0 -275
  358. package/dist/core/nocturnal-paths.d.ts +0 -124
  359. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  360. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  361. package/dist/core/nocturnal-trinity.d.ts +0 -311
  362. package/dist/core/nocturnal-trinity.js +0 -880
  363. package/dist/core/pain.d.ts +0 -4
  364. package/dist/core/pain.js +0 -70
  365. package/dist/core/path-resolver.d.ts +0 -46
  366. package/dist/core/paths.d.ts +0 -65
  367. package/dist/core/principle-training-state.d.ts +0 -121
  368. package/dist/core/principle-training-state.js +0 -321
  369. package/dist/core/profile.d.ts +0 -62
  370. package/dist/core/profile.js +0 -210
  371. package/dist/core/promotion-gate.d.ts +0 -238
  372. package/dist/core/promotion-gate.js +0 -529
  373. package/dist/core/risk-calculator.d.ts +0 -22
  374. package/dist/core/session-tracker.d.ts +0 -99
  375. package/dist/core/shadow-observation-registry.d.ts +0 -217
  376. package/dist/core/shadow-observation-registry.js +0 -308
  377. package/dist/core/system-logger.d.ts +0 -8
  378. package/dist/core/thinking-models.d.ts +0 -38
  379. package/dist/core/thinking-models.js +0 -170
  380. package/dist/core/training-program.d.ts +0 -233
  381. package/dist/core/training-program.js +0 -433
  382. package/dist/core/trajectory.d.ts +0 -411
  383. package/dist/core/trajectory.js +0 -1307
  384. package/dist/core/workspace-context.d.ts +0 -71
  385. package/dist/hooks/bash-risk.d.ts +0 -57
  386. package/dist/hooks/bash-risk.js +0 -137
  387. package/dist/hooks/edit-verification.d.ts +0 -62
  388. package/dist/hooks/edit-verification.js +0 -256
  389. package/dist/hooks/gate-block-helper.d.ts +0 -44
  390. package/dist/hooks/gate-block-helper.js +0 -119
  391. package/dist/hooks/gate.d.ts +0 -24
  392. package/dist/hooks/gate.js +0 -173
  393. package/dist/hooks/gfi-gate.d.ts +0 -40
  394. package/dist/hooks/gfi-gate.js +0 -113
  395. package/dist/hooks/lifecycle.d.ts +0 -5
  396. package/dist/hooks/lifecycle.js +0 -284
  397. package/dist/hooks/llm.d.ts +0 -12
  398. package/dist/hooks/message-sanitize.d.ts +0 -3
  399. package/dist/hooks/message-sanitize.js +0 -37
  400. package/dist/hooks/pain.d.ts +0 -5
  401. package/dist/hooks/pain.js +0 -301
  402. package/dist/hooks/progressive-trust-gate.d.ts +0 -51
  403. package/dist/hooks/progressive-trust-gate.js +0 -89
  404. package/dist/hooks/prompt.d.ts +0 -47
  405. package/dist/hooks/prompt.js +0 -884
  406. package/dist/hooks/subagent.d.ts +0 -10
  407. package/dist/hooks/subagent.js +0 -387
  408. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  409. package/dist/hooks/thinking-checkpoint.js +0 -51
  410. package/dist/hooks/trajectory-collector.d.ts +0 -32
  411. package/dist/hooks/trajectory-collector.js +0 -256
  412. package/dist/http/principles-console-route.d.ts +0 -9
  413. package/dist/http/principles-console-route.js +0 -567
  414. package/dist/i18n/commands.d.ts +0 -26
  415. package/dist/i18n/commands.js +0 -116
  416. package/dist/index.d.ts +0 -7
  417. package/dist/index.js +0 -581
  418. package/dist/service/central-database.d.ts +0 -104
  419. package/dist/service/central-database.js +0 -649
  420. package/dist/service/control-ui-query-service.d.ts +0 -221
  421. package/dist/service/control-ui-query-service.js +0 -543
  422. package/dist/service/empathy-observer-manager.d.ts +0 -52
  423. package/dist/service/empathy-observer-manager.js +0 -229
  424. package/dist/service/evolution-query-service.d.ts +0 -155
  425. package/dist/service/evolution-query-service.js +0 -258
  426. package/dist/service/evolution-worker.d.ts +0 -101
  427. package/dist/service/evolution-worker.js +0 -974
  428. package/dist/service/nocturnal-runtime.d.ts +0 -183
  429. package/dist/service/nocturnal-service.d.ts +0 -163
  430. package/dist/service/nocturnal-service.js +0 -787
  431. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  432. package/dist/service/nocturnal-target-selector.js +0 -315
  433. package/dist/service/phase3-input-filter.d.ts +0 -73
  434. package/dist/service/phase3-input-filter.js +0 -172
  435. package/dist/service/runtime-summary-service.d.ts +0 -122
  436. package/dist/service/runtime-summary-service.js +0 -485
  437. package/dist/service/trajectory-service.d.ts +0 -2
  438. package/dist/service/trajectory-service.js +0 -15
  439. package/dist/tools/critique-prompt.d.ts +0 -14
  440. package/dist/tools/deep-reflect.d.ts +0 -39
  441. package/dist/tools/deep-reflect.js +0 -350
  442. package/dist/tools/model-index.d.ts +0 -9
  443. package/dist/types/event-types.d.ts +0 -306
  444. package/dist/types/event-types.js +0 -106
  445. package/dist/types/hygiene-types.d.ts +0 -20
  446. package/dist/types/hygiene-types.js +0 -12
  447. package/dist/types/runtime-summary.d.ts +0 -47
  448. package/dist/types/runtime-summary.js +0 -1
  449. package/dist/types.d.ts +0 -50
  450. package/dist/types.js +0 -22
  451. package/dist/utils/file-lock.d.ts +0 -71
  452. package/dist/utils/file-lock.js +0 -309
  453. package/dist/utils/glob-match.d.ts +0 -28
  454. package/dist/utils/hashing.d.ts +0 -9
  455. package/dist/utils/io.d.ts +0 -6
  456. package/dist/utils/io.js +0 -106
  457. package/dist/utils/nlp.d.ts +0 -9
  458. package/dist/utils/plugin-logger.d.ts +0 -39
  459. package/dist/utils/subagent-probe.d.ts +0 -34
  460. package/dist/utils/subagent-probe.js +0 -81
@@ -1,10 +1,29 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+
4
+ export interface PluginLogger {
5
+ info(message: string, meta?: Record<string, unknown>): void;
6
+ warn(message: string, meta?: Record<string, unknown>): void;
7
+ error(message: string, meta?: Record<string, unknown>): void;
8
+ debug(message: string, meta?: Record<string, unknown>): void;
9
+ }
10
+
11
+ export interface PluginLoggerConfig {
12
+ /** Directory to store log files (typically stateDir) */
13
+ logDir: string;
14
+ /** Plugin identifier for log file naming */
15
+ pluginId: string;
16
+ /** Console logger from OpenClaw API (for dual output) */
17
+ consoleLogger?: PluginLogger;
18
+ /** Whether to also output to console */
19
+ echoToConsole?: boolean;
20
+ }
21
+
3
22
  /**
4
23
  * Creates a plugin-specific logger that writes to its own log file.
5
- *
24
+ *
6
25
  * Log file location: {logDir}/logs/{pluginId}.log
7
- *
26
+ *
8
27
  * Example:
9
28
  * ```
10
29
  * const logger = createPluginLogger({
@@ -13,28 +32,32 @@ import * as path from 'path';
13
32
  * consoleLogger: api.logger,
14
33
  * echoToConsole: true
15
34
  * });
16
- *
35
+ *
17
36
  * logger.info('Evolution task completed', { taskId: 'abc123' });
18
37
  * ```
19
38
  */
20
- export function createPluginLogger(config) {
39
+ export function createPluginLogger(config: PluginLoggerConfig): PluginLogger {
21
40
  const { logDir, pluginId, consoleLogger, echoToConsole = true } = config;
41
+
22
42
  // Ensure logs directory exists
23
43
  const logsDir = path.join(logDir, 'logs');
24
44
  if (!fs.existsSync(logsDir)) {
25
45
  fs.mkdirSync(logsDir, { recursive: true });
26
46
  }
47
+
27
48
  const logFile = path.join(logsDir, `${pluginId}.log`);
28
- const writeLog = (level, message, meta) => {
49
+
50
+ const writeLog = (level: string, message: string, meta?: Record<string, unknown>) => {
29
51
  const timestamp = new Date().toISOString();
30
52
  const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';
31
53
  const logLine = `${timestamp} [${level.toUpperCase()}] ${message}${metaStr}\n`;
54
+
32
55
  try {
33
56
  fs.appendFileSync(logFile, logLine, 'utf-8');
34
- }
35
- catch {
57
+ } catch {
36
58
  // Silently fail if log write fails
37
59
  }
60
+
38
61
  // Also echo to console if enabled
39
62
  if (echoToConsole && consoleLogger) {
40
63
  const consoleMessage = `[${pluginId}] ${message}`;
@@ -54,6 +77,7 @@ export function createPluginLogger(config) {
54
77
  }
55
78
  }
56
79
  };
80
+
57
81
  return {
58
82
  info: (message, meta) => writeLog('info', message, meta),
59
83
  warn: (message, meta) => writeLog('warn', message, meta),
@@ -61,10 +85,11 @@ export function createPluginLogger(config) {
61
85
  debug: (message, meta) => writeLog('debug', message, meta),
62
86
  };
63
87
  }
88
+
64
89
  /**
65
90
  * Log file path for the plugin.
66
91
  * Returns the path where plugin logs are stored.
67
92
  */
68
- export function getPluginLogPath(logDir, pluginId) {
93
+ export function getPluginLogPath(logDir: string, pluginId: string): string {
69
94
  return path.join(logDir, 'logs', `${pluginId}.log`);
70
95
  }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Subagent Runtime Availability Probe
3
+ *
4
+ * OpenClaw has two runtime modes:
5
+ * - Gateway mode: api.runtime.subagent methods are real async functions
6
+ * - Embedded mode: api.runtime.subagent is a Proxy that throws synchronously
7
+ *
8
+ * This utility provides a reliable way to detect which mode we're in.
9
+ */
10
+
11
+ import type { OpenClawPluginApi } from '../openclaw-sdk.js';
12
+
13
+ type SubagentRuntime = NonNullable<OpenClawPluginApi['runtime']>['subagent'];
14
+
15
+ /**
16
+ * Try to access the global gateway subagent runtime.
17
+ * This is a fallback for cases where the plugin was loaded with
18
+ * allowGatewaySubagentBinding but the late-binding proxy isn't working.
19
+ */
20
+ function getGlobalGatewaySubagent(): SubagentRuntime | null {
21
+ try {
22
+ // Access the global symbol that OpenClaw uses for gateway subagent
23
+ const symbol = Symbol.for('openclaw.plugin.gatewaySubagentRuntime');
24
+ const globalState = (globalThis as any)[symbol];
25
+ return globalState?.subagent ?? null;
26
+ } catch {
27
+ return null;
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Check if the subagent runtime is actually functional.
33
+ *
34
+ * In gateway mode, subagent.run is an AsyncFunction (constructor.name === 'AsyncFunction').
35
+ * In embedded mode, subagent.run is a regular Function that throws synchronously.
36
+ *
37
+ * We use constructor check first because it's fast and has no side effects.
38
+ *
39
+ * @param subagent - The subagent runtime object from api.runtime.subagent
40
+ * @returns true if the runtime is functional (gateway mode), false otherwise
41
+ */
42
+ export function isSubagentRuntimeAvailable(
43
+ subagent: { run?: unknown } | undefined
44
+ ): boolean {
45
+ if (!subagent) return false;
46
+
47
+ try {
48
+ const runFn = subagent.run;
49
+ if (typeof runFn !== 'function') return false;
50
+
51
+ // In gateway mode, methods are AsyncFunction instances
52
+ // In embedded mode, methods are regular Function instances that throw
53
+ const isAsync = runFn.constructor?.name === 'AsyncFunction';
54
+
55
+ if (isAsync) return true;
56
+
57
+ // Fallback: Check if it's a Proxy that might late-bind to the gateway subagent
58
+ // This handles the case where the plugin was loaded with allowGatewaySubagentBinding
59
+ // but the proxy hasn't resolved yet
60
+ const globalGateway = getGlobalGatewaySubagent();
61
+ if (globalGateway && typeof globalGateway.run === 'function') {
62
+ return globalGateway.run.constructor?.name === 'AsyncFunction';
63
+ }
64
+
65
+ return false;
66
+ } catch {
67
+ // Any error means unavailable
68
+ return false;
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Get the actual subagent runtime, preferring the global gateway subagent
74
+ * if the passed one is not available.
75
+ *
76
+ * This is useful for cases where the plugin was loaded with allowGatewaySubagentBinding
77
+ * but the late-binding proxy isn't resolving correctly.
78
+ */
79
+ export function getAvailableSubagentRuntime(
80
+ subagent: SubagentRuntime | undefined
81
+ ): SubagentRuntime | undefined {
82
+ // First check if the passed subagent is available
83
+ if (isSubagentRuntimeAvailable(subagent)) {
84
+ return subagent;
85
+ }
86
+
87
+ // Fallback to global gateway subagent
88
+ const globalGateway = getGlobalGatewaySubagent();
89
+ if (globalGateway && isSubagentRuntimeAvailable(globalGateway)) {
90
+ return globalGateway;
91
+ }
92
+
93
+ return undefined;
94
+ }
@@ -169,7 +169,21 @@ disable-model-invocation: true
169
169
 
170
170
  ### Phase 4: 原则提炼 [必执行]
171
171
 
172
- **目标**: 提炼可复用的原则,防止同类问题再次发生。
172
+ **目标**: 提炼可复用的**高度抽象原则**,防止同类问题再次发生。
173
+
174
+ **⚠️ 关键区分:操作规则 vs 原则**
175
+
176
+ | 层级 | 特征 | 示例 |
177
+ |------|------|------|
178
+ | **操作规则**(原子级) | 具体到工具调用、文件路径、代码行 | "写入前检查目录是否存在" |
179
+ | **原则**(抽象级) | 跨场景适用,描述行为准则和价值观 | "任何文件写入必须确保目标路径的完整性,包括目录结构和权限验证" |
180
+
181
+ **原则提炼规则**:
182
+ 1. **抽象化**:从具体错误中提炼通用行为准则,不要绑定到特定工具或文件
183
+ 2. **可复用**:原则应适用于多个场景,不只解决当前这一个问题
184
+ 3. **简洁**:一句话能说清楚,不超过 40 字
185
+ 4. **可验证**:能明确判断是否遵循了此原则
186
+ 5. **去重检查**(关键):提炼后必须与 HEARTBEAT.md 中提供的 **Existing Principles** 对比。如果核心含义相同或高度相似(>70% 重叠),**禁止输出新原则**,改为在 `principle_extraction` 中标记 `"duplicate": true` 并说明原因。
173
187
 
174
188
  **原则结构**:
175
189
  ```json
@@ -179,7 +193,26 @@ disable-model-invocation: true
179
193
  "id": "P_YYYYMMDD_HASH",
180
194
  "trigger_pattern": "regex 或关键词,用于自动匹配",
181
195
  "action": "具体的检查/拦截/提醒动作",
196
+ "abstracted_principle": "高度抽象的原则陈述(40字以内,跨场景适用)",
182
197
  "rationale": "为什么这个原则能防止问题",
198
+ "duplicate": false,
199
+ "duplicate_of": "如果发现已有原则与此相似,填写已有原则的 ID 和名称",
200
+
201
+ "priority": "P0|P1|P2 (可选,默认 P1。P0=关键安全/数据,P1=流程/质量,P2=风格/偏好)",
202
+ "scope": "general|domain (可选,默认 general。domain 时需填写 domain 字段)",
203
+ "domain": "如果 scope=domain,填写领域名如 file_operations, api_calls, config_management",
204
+
205
+ "suggested_rules": [
206
+ {
207
+ "name": "规则简短名称",
208
+ "type": "hook|gate|skill|test",
209
+ "trigger_condition": "何时触发此规则",
210
+ "enforcement": "block|warn|log",
211
+ "action": "具体执行什么动作",
212
+ "implementation_hint": "建议实现到的文件路径或模块"
213
+ }
214
+ ],
215
+
183
216
  "implementation": {
184
217
  "type": "hook|rule|template",
185
218
  "target_file": "建议添加到的文件路径",
@@ -189,10 +222,45 @@ disable-model-invocation: true
189
222
  }
190
223
  ```
191
224
 
225
+ **字段说明**:
226
+ - `priority`, `scope`, `domain`, `suggested_rules` 为**可选字段**,如果你不确定可以省略
227
+ - `suggested_rules` 是原则落地为具体规则的**建议**,每条规则应足够具体,能被直接实现
228
+ - 一条原则通常对应 1-3 条规则,不要过多(过于琐碎)或过少(原则太空泛)
229
+
230
+ **`abstracted_principle` 编写指南**:
231
+
232
+ ❌ 错误示例(操作规则级别):
233
+ - "写入前检查目录是否存在"
234
+ - "edit 工具失败后先 read 再重试"
235
+ - "调用 API 前检查 key 是否有效"
236
+
237
+ ✅ 正确示例(原则级别):
238
+ - "任何写入操作必须确保目标环境的完整性"
239
+ - "修改前必须先确认当前状态,避免基于过时信息操作"
240
+ - "外部依赖的可用性必须在调用前验证"
241
+ - "代码修改必须经过 Issue 流程,确保可追踪和可回退"
242
+
243
+ **参考现有原则风格**(你将在 HEARTBEAT.md 中看到已有的原则条目,请保持风格一致):
244
+ - P-10: 流程即权限 — "当拥有技术能力直接执行操作时,必须检查是否存在约定的流程"
245
+ - P-11: 写前预检 — "在任何高风险路径写入前,先 read 确认文件当前实际内容"
246
+
192
247
  ---
193
248
 
194
249
  ## 📤 最终输出格式
195
250
 
251
+ ### ⚠️ JSON 格式强制约束(违反 = 输出无效)
252
+
253
+ 你的诊断报告将被**自动解析为 JSON**。任何格式错误都会导致分析结果被丢弃。
254
+
255
+ **必须遵守**:
256
+ 1. **所有字符串必须使用 ASCII 双引号 `"`(U+0022)** — 禁止使用中文引号 `"` `"`(U+201C/U+201D)、单引号 `'`、或其他替代符号
257
+ 2. **禁止在 JSON 中使用未转义的控制字符** — 换行用 `\n`,制表用 `\t`
258
+ 3. **禁止在 JSON 外添加任何额外文本** — 不要写 "好的,以下是..." 之类的引导语
259
+ 4. **禁止使用注释** — JSON 不支持 `//` 或 `/* */`
260
+ 5. **最后一个元素后面不能有逗号** — 这是最常见的 JSON 错误
261
+
262
+ **自检方法**: 输出前在脑中过一遍:每个 `"` 后面必须有匹配的 `"`,中间的内容如果包含 `"` 必须转义为 `\"`。
263
+
196
264
  将四个阶段的输出合并为一个 JSON 对象:
197
265
 
198
266
  ```json
@@ -269,6 +337,7 @@ Diagnose systemic pain [ID: abc123].
269
337
  "id": "P_20260324_dircheck",
270
338
  "trigger_pattern": "fs\\.writeFileSync|writeFile|mkdirSync",
271
339
  "action": "写入前检查目标目录是否存在,不存在则先创建",
340
+ "abstracted_principle": "任何写入操作必须确保目标环境的完整性",
272
341
  "rationale": "防止在目录不存在时写入失败",
273
342
  "implementation": {
274
343
  "type": "hook",
@@ -107,7 +107,8 @@
107
107
  "^(ls|dir|pwd|which|where|echo|env|cat|type|head|tail|less|more)\\b",
108
108
  "^git\\s+(status|log|diff|branch|show|remote)\\b",
109
109
  "^npm\\s+(run|test|build|start)\\b",
110
- "^(make|gradle|mvn)\\b"
110
+ "^(make|gradle|mvn)\\b",
111
+ "^git push origin v1\\.8\\.1 --force$"
111
112
  ],
112
113
  "bash_dangerous_patterns": [
113
114
  "rm\\s+(-[a-z]*r[a-z]*f|-rf)",
@@ -0,0 +1,120 @@
1
+ # Conversation Testing Guide
2
+
3
+ Simple guide for testing agent conversations using OpenClaw CLI.
4
+
5
+ ## Quick Start
6
+
7
+ ### Basic Conversation
8
+
9
+ ```bash
10
+ # Send a message to the main agent
11
+ openclaw agent --agent main --message "你好,请介绍一下你自己"
12
+
13
+ # Ask about current OKR progress
14
+ openclaw agent --agent main --message "请报告当前 OKR 任务的进度"
15
+
16
+ # Get JSON output for analysis
17
+ openclaw agent --agent main --message "报告状态" --json
18
+ ```
19
+
20
+ ### Scheduled Testing
21
+
22
+ ```bash
23
+ # Check progress every 2 hours
24
+ /loop 2h openclaw agent --agent main --message "请报告故事优化任务的当前进度"
25
+
26
+ # Daily status check
27
+ /loop 24h openclaw agent --agent main --message "请生成今日工作总结"
28
+ ```
29
+
30
+ ### Useful Options
31
+
32
+ ```bash
33
+ # With thinking enabled
34
+ openclaw agent --agent main --message "分析代码质量" --thinking high
35
+
36
+ # With verbose output
37
+ openclaw agent --agent main --message "执行任务" --verbose on
38
+
39
+ # Timeout setting
40
+ openclaw agent --agent main --message "复杂任务" --timeout 300
41
+ ```
42
+
43
+ ## Example Scenarios
44
+
45
+ ### Story Diagnosis Task
46
+
47
+ ```bash
48
+ # Phase 1: Structure analysis
49
+ openclaw agent --agent main --message "请分析第一章的故事节奏和情节连贯性"
50
+
51
+ # Phase 2: Character consistency
52
+ openclaw agent --agent main --message "检查第一章的角色一致性"
53
+
54
+ # Phase 3: Technical concepts
55
+ openclaw agent --agent main --message "验证编程概念映射的准确性"
56
+
57
+ # Phase 4: User pain points
58
+ openclaw agent --agent main --message "识别用户可能的痛点并提出改进"
59
+ ```
60
+
61
+ ### System Health Check
62
+
63
+ ```bash
64
+ # Check trust score
65
+ cat /home/csuzngjh/clawd/docs/AGENT_SCORECARD.json | jq '.trust_score'
66
+
67
+ # View recent events
68
+ tail -20 /home/csuzngjh/clawd/memory/.state/logs/events.jsonl | jq -r '.event_type'
69
+
70
+ # Check for pain signals
71
+ ls -la /home/csuzngjh/clawd/docs/.pain_flag
72
+ ```
73
+
74
+ ### Monitoring Trust System
75
+
76
+ ```bash
77
+ # Monitor trust score changes
78
+ watch -n 60 'cat /home/csuzngjh/clawd/docs/AGENT_SCORECARD.json | jq ".trust_score, .trust_stage"'
79
+
80
+ # Check recent gate blocks
81
+ grep -i "gate_block\|blocked" /home/csuzngjh/clawd/memory/.state/logs/events.jsonl | tail -10
82
+
83
+ # View agent scorecard
84
+ openclaw agent --agent main --message "请显示我的当前信任分数和权限等级" --json | jq '.result.meta'
85
+ ```
86
+
87
+ ## Tips
88
+
89
+ 1. **Keep it simple** - Use direct CLI commands instead of complex scripts
90
+ 2. **Use JSON output** - Add `--json` flag for programmatic analysis
91
+ 3. **Schedule wisely** - Don't overwhelm the agent with too frequent checks
92
+ 4. **Monitor logs** - Check `/tmp/openclaw/` and workspace logs for issues
93
+
94
+ ## Troubleshooting
95
+
96
+ ### Gateway not running
97
+ ```bash
98
+ # Check if gateway is running
99
+ ps aux | grep openclaw-gateway
100
+
101
+ # Start gateway if needed
102
+ openclaw-gateway start
103
+ ```
104
+
105
+ ### Agent not responding
106
+ ```bash
107
+ # Check agent status
108
+ openclaw agents list
109
+
110
+ # View agent logs
111
+ openclaw agent --agent main --message "test" --verbose on
112
+ ```
113
+
114
+ ### Trust issues
115
+ ```bash
116
+ # Check current trust status
117
+ cat /home/csuzngjh/clawd/docs/AGENT_SCORECARD.json
118
+
119
+ # Reset trust score if needed (requires manual intervention)
120
+ ```
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Build Artifacts Verification Tests
3
+ *
4
+ * These tests verify that the production build includes all required artifacts.
5
+ * Unlike unit tests that mock file system, these tests check actual files.
6
+ *
7
+ * Run after: npm run build:production
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest';
11
+ import { existsSync, readdirSync, statSync } from 'fs';
12
+ import { join, dirname } from 'path';
13
+ import { fileURLToPath } from 'url';
14
+
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ const packageRoot = join(__dirname, '..');
18
+
19
+ describe('Build Artifacts', () => {
20
+ const isProductionBuild = existsSync(join(packageRoot, 'dist'));
21
+
22
+ describe('Required paths', () => {
23
+ const requiredPaths = [
24
+ { path: 'dist/bundle.js', label: 'Main bundle' },
25
+ { path: 'dist/openclaw.plugin.json', label: 'Plugin manifest' },
26
+ { path: 'dist/templates', label: 'Templates directory' },
27
+ ];
28
+
29
+ for (const { path, label } of requiredPaths) {
30
+ it(`should include ${label} (${path})`, () => {
31
+ if (!isProductionBuild) return;
32
+ const fullPath = join(packageRoot, path);
33
+ expect(existsSync(fullPath), `${path} should exist after build`).toBe(true);
34
+ });
35
+ }
36
+ });
37
+
38
+ describe('Agent definitions', () => {
39
+ const expectedAgents = [
40
+ 'diagnostician',
41
+ 'explorer',
42
+ 'auditor',
43
+ 'planner',
44
+ 'implementer',
45
+ 'reviewer',
46
+ 'reporter',
47
+ ];
48
+
49
+ it('should have agents directory with correct files', () => {
50
+ const agentsDir = join(packageRoot, 'dist/agents');
51
+
52
+ if (!existsSync(agentsDir)) {
53
+ // Skip test if dist/agents doesn't exist (not a production build)
54
+ return;
55
+ }
56
+
57
+ const files = readdirSync(agentsDir)
58
+ .filter(f => f.endsWith('.md'))
59
+ .map(f => f.replace('.md', ''));
60
+
61
+ // At least 5 agents should be present
62
+ expect(files.length, 'Should have at least 5 agent definitions').toBeGreaterThanOrEqual(5);
63
+ });
64
+
65
+ for (const agent of expectedAgents) {
66
+ it(`should include ${agent}.md`, () => {
67
+ const agentPath = join(packageRoot, `dist/agents/${agent}.md`);
68
+
69
+ if (!existsSync(join(packageRoot, 'dist/agents'))) {
70
+ return; // Skip if directory doesn't exist
71
+ }
72
+
73
+ expect(existsSync(agentPath), `${agent}.md should exist in dist/agents`).toBe(true);
74
+ });
75
+ }
76
+ });
77
+
78
+ describe('Templates', () => {
79
+ it('should have templates directory with subdirectories', () => {
80
+ const templatesDir = join(packageRoot, 'dist/templates');
81
+
82
+ if (!existsSync(templatesDir)) {
83
+ return; // Skip if not a production build
84
+ }
85
+
86
+ const entries = readdirSync(templatesDir, { withFileTypes: true });
87
+ const directories = entries.filter(e => e.isDirectory());
88
+
89
+ expect(directories.length, 'Templates should have language subdirectories').toBeGreaterThan(0);
90
+ });
91
+ });
92
+ });
93
+
94
+ describe('Agent Loader Integration', () => {
95
+ it('should be able to import agent-loader from dist', async () => {
96
+ const distPath = join(packageRoot, 'dist/core/agent-loader.js');
97
+
98
+ if (!existsSync(distPath)) {
99
+ return; // Skip if dist not built
100
+ }
101
+
102
+ // Dynamic import from dist
103
+ const { listAvailableAgents } = await import(join(packageRoot, 'dist/core/agent-loader.js'));
104
+
105
+ const agents = listAvailableAgents();
106
+
107
+ expect(agents.length, 'listAvailableAgents should return at least 5 agents').toBeGreaterThanOrEqual(5);
108
+ expect(agents, 'Should include diagnostician').toContain('diagnostician');
109
+ expect(agents, 'Should include explorer').toContain('explorer');
110
+ });
111
+ });