@joekytc/dsh-swarm 0.1.1 → 0.2.0

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 (569) hide show
  1. package/README.md +3 -3
  2. package/README.zh-CN.md +3 -3
  3. package/client/BoardCard.tsx +24 -2
  4. package/client/ConfigSection.tsx +71 -0
  5. package/client/ConfigSelect.tsx +69 -0
  6. package/client/KanbanBoard.tsx +3 -0
  7. package/client/KanbanTab.tsx +4 -3
  8. package/client/TaskDrawer.tsx +31 -31
  9. package/client/WorkflowRail.tsx +3 -1
  10. package/client/config-store.ts +51 -0
  11. package/client/config.css +110 -0
  12. package/client/index.ts +39 -4
  13. package/client/kanban.css +134 -2
  14. package/client/session-bridge.ts +39 -0
  15. package/client/timeline-model.ts +210 -0
  16. package/client/workflow-model.ts +3 -1
  17. package/lib/client.js +549 -64
  18. package/lib/config.d.ts +19 -4
  19. package/lib/config.js +18 -3
  20. package/lib/dispatcher/agent-runner.d.ts +28 -6
  21. package/lib/dispatcher/agent-runner.js +175 -62
  22. package/lib/dispatcher/chain-auditor.js +4 -1
  23. package/lib/dispatcher/dispatcher.d.ts +62 -3
  24. package/lib/dispatcher/dispatcher.js +243 -20
  25. package/lib/dispatcher/session-events.d.ts +11 -15
  26. package/lib/dispatcher/session-events.js +17 -5
  27. package/lib/dispatcher/v-orchestrator.d.ts +42 -9
  28. package/lib/dispatcher/v-orchestrator.js +236 -28
  29. package/lib/domain/config-override.d.ts +38 -0
  30. package/lib/domain/config-override.js +101 -0
  31. package/lib/domain/delivery-contract.d.ts +3 -2
  32. package/lib/domain/delivery-contract.js +28 -16
  33. package/lib/domain/gate-policy.d.ts +26 -0
  34. package/lib/domain/gate-policy.js +44 -0
  35. package/lib/domain/kanban-service.d.ts +16 -3
  36. package/lib/domain/kanban-service.js +41 -6
  37. package/lib/domain/memory.d.ts +29 -0
  38. package/lib/domain/memory.js +145 -0
  39. package/lib/domain/permissions.js +1 -1
  40. package/lib/domain/planning-checklist.d.ts +5 -0
  41. package/lib/domain/planning-checklist.js +80 -6
  42. package/lib/domain/projection.js +2 -1
  43. package/lib/domain/review-evidence.js +1 -1
  44. package/lib/domain/state-machine.js +2 -1
  45. package/lib/domain/types.d.ts +2 -2
  46. package/lib/index.js +19 -21
  47. package/lib/roles/clean-fs-tools.d.ts +22 -0
  48. package/lib/roles/clean-fs-tools.js +118 -0
  49. package/lib/roles/skill-installer.d.ts +6 -0
  50. package/lib/roles/skill-installer.js +32 -0
  51. package/lib/roles/toolsets.d.ts +13 -1
  52. package/lib/roles/toolsets.js +163 -31
  53. package/lib/roles/wiki-worker.d.ts +1 -0
  54. package/lib/roles/wiki-worker.js +10 -2
  55. package/lib/routes/kanban-http.d.ts +5 -2
  56. package/lib/routes/kanban-http.js +36 -3
  57. package/lib/routes/planning-driver.d.ts +7 -6
  58. package/lib/routes/planning-driver.js +19 -11
  59. package/lib/routes/prefix-router.d.ts +28 -13
  60. package/lib/routes/prefix-router.js +66 -1
  61. package/lib/services/config-provider.d.ts +42 -0
  62. package/lib/services/config-provider.js +94 -0
  63. package/lib/services/gate-runner.d.ts +24 -0
  64. package/lib/services/gate-runner.js +87 -0
  65. package/lib/services/kanban-provider.d.ts +5 -1
  66. package/lib/services/kanban-provider.js +40 -2
  67. package/lib/services/llm-catalog.d.ts +35 -0
  68. package/lib/services/llm-catalog.js +19 -0
  69. package/lib/tools/kanban-tools.js +1 -0
  70. package/lib/tools/main-session-tools.d.ts +17 -2
  71. package/lib/tools/main-session-tools.js +112 -25
  72. package/lib/tools/planning-tools.d.ts +9 -0
  73. package/lib/tools/planning-tools.js +120 -4
  74. package/lib/tools/prefetch-tools.js +1 -0
  75. package/lib/tools/spec-card-tools.js +1 -0
  76. package/lib/tools/wiki-tools.js +5 -4
  77. package/lib/wiki/kb-linkage.d.ts +9 -2
  78. package/lib/wiki/kb-linkage.js +3 -3
  79. package/lib/wiki/local-kb-client.d.ts +14 -0
  80. package/lib/wiki/local-kb-client.js +101 -0
  81. package/lib/wiki/local-kb.d.ts +6 -0
  82. package/lib/wiki/local-kb.js +25 -0
  83. package/lib/wiki/memory-recall.d.ts +24 -0
  84. package/lib/wiki/memory-recall.js +62 -0
  85. package/lib/wiki/page-path.d.ts +10 -1
  86. package/lib/wiki/page-path.js +31 -8
  87. package/lib/wiki/wiki-vault-client.d.ts +4 -3
  88. package/lib/wiki/wiki-vault-client.js +6 -6
  89. package/package.json +16 -11
  90. package/personas/kanban-d/preset.yml +1 -1
  91. package/personas/kanban-dt/agent.cordis.yml +3 -3
  92. package/personas/kanban-dt/preset.yml +1 -1
  93. package/personas/kanban-p/agent.cordis.yml +16 -0
  94. package/personas/kanban-p/preset.yml +1 -1
  95. package/personas/kanban-pt/agent.cordis.yml +38 -8
  96. package/personas/kanban-pt/preset.yml +1 -1
  97. package/personas/kanban-w/agent.cordis.yml +35 -16
  98. package/personas/kanban-w/preset.yml +1 -1
  99. package/personas/persona-dt.md +1 -1
  100. package/personas/persona-p.md +4 -1
  101. package/personas/persona-pt.md +13 -6
  102. package/personas/persona-w.md +11 -9
  103. package/skills/grill-me/SKILL.md +71 -0
  104. package/skills/llm-wiki-skill/.mise.toml +2 -0
  105. package/skills/llm-wiki-skill/.nvmrc +1 -0
  106. package/skills/llm-wiki-skill/AGENTS.md +173 -0
  107. package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
  108. package/skills/llm-wiki-skill/CLAUDE.md +152 -0
  109. package/skills/llm-wiki-skill/HERMES.md +44 -0
  110. package/skills/llm-wiki-skill/README.en.md +261 -0
  111. package/skills/llm-wiki-skill/README.md +291 -0
  112. package/skills/llm-wiki-skill/SKILL.md +1133 -0
  113. package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
  114. package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
  115. package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
  116. package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
  117. package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
  118. package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
  119. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
  120. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
  121. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
  122. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
  123. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
  124. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
  125. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
  126. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
  127. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
  128. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
  129. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
  130. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
  131. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
  132. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
  133. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
  134. package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
  135. package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
  136. package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
  137. package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
  138. package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
  139. package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
  140. package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
  141. package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
  142. package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
  143. package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
  144. package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
  145. package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
  146. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
  147. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
  148. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
  149. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
  150. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
  151. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
  152. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
  153. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
  154. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
  155. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
  156. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
  157. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
  158. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
  159. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
  160. package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
  161. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
  162. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
  163. package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
  164. package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
  165. package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
  166. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
  167. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
  168. package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
  169. package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
  170. package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
  171. package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
  172. package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
  173. package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
  174. package/skills/llm-wiki-skill/install.ps1 +87 -0
  175. package/skills/llm-wiki-skill/install.sh +722 -0
  176. package/skills/llm-wiki-skill/package-lock.json +11171 -0
  177. package/skills/llm-wiki-skill/package.json +24 -0
  178. package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
  179. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
  180. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
  181. package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
  182. package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
  183. package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
  184. package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
  185. package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
  186. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
  187. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
  188. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
  189. package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
  190. package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
  191. package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
  192. package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
  193. package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
  194. package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
  195. package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
  196. package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
  197. package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
  198. package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
  199. package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
  200. package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
  201. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
  202. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
  203. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
  204. package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
  205. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
  206. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
  207. package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
  208. package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
  209. package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
  210. package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
  211. package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
  212. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
  213. package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
  214. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
  215. package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
  216. package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
  217. package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
  218. package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
  219. package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
  220. package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
  221. package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
  222. package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
  223. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
  224. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
  225. package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
  226. package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
  227. package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
  228. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
  229. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
  230. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
  231. package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
  232. package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
  233. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
  234. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
  235. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
  236. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
  237. package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
  238. package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
  239. package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
  240. package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
  241. package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
  242. package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
  243. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
  244. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
  245. package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
  246. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
  247. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
  248. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
  249. package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
  250. package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
  251. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
  252. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
  253. package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
  254. package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
  255. package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
  256. package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
  257. package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
  258. package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
  259. package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
  260. package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
  261. package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
  262. package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
  263. package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
  264. package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
  265. package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
  266. package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
  267. package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
  268. package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
  269. package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
  270. package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
  271. package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
  272. package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
  273. package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
  274. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
  275. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
  276. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
  277. package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
  278. package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
  279. package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
  280. package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
  281. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
  282. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
  283. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
  284. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
  285. package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
  286. package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
  287. package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
  288. package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
  289. package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
  290. package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
  291. package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
  292. package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
  293. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
  294. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
  295. package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
  296. package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
  297. package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
  298. package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
  299. package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
  300. package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
  301. package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
  302. package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
  303. package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
  304. package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
  305. package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
  306. package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
  307. package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
  308. package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
  309. package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
  310. package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
  311. package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
  312. package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
  313. package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
  314. package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
  315. package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
  316. package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
  317. package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
  318. package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
  319. package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
  320. package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
  321. package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
  322. package/skills/llm-wiki-skill/setup.sh +8 -0
  323. package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
  324. package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
  325. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
  326. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
  327. package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
  328. package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
  329. package/skills/llm-wiki-skill/templates/index-template.md +51 -0
  330. package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
  331. package/skills/llm-wiki-skill/templates/log-template.md +11 -0
  332. package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
  333. package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
  334. package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
  335. package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
  336. package/skills/llm-wiki-skill/templates/query-template.md +19 -0
  337. package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
  338. package/skills/llm-wiki-skill/templates/source-template.md +51 -0
  339. package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
  340. package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
  341. package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
  342. package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
  343. package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
  344. package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
  345. package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
  346. package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
  347. package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
  348. package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
  349. package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
  350. package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
  351. package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
  352. package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
  353. package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
  354. package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
  355. package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
  356. package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
  357. package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
  358. package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
  359. package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
  360. package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
  361. package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
  362. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
  363. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
  364. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
  365. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
  366. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
  367. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
  368. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
  369. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
  370. package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
  371. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
  372. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
  373. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
  374. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
  375. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
  376. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
  377. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
  378. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
  379. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
  380. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
  381. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
  382. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
  383. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
  384. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
  385. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
  386. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
  387. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
  388. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
  389. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
  390. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
  391. package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
  392. package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
  393. package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
  394. package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
  395. package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
  396. package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
  397. package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
  398. package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
  399. package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
  400. package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
  401. package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
  402. package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
  403. package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
  404. package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
  405. package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
  406. package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
  407. package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
  408. package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
  409. package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
  410. package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
  411. package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
  412. package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
  413. package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
  414. package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
  415. package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
  416. package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
  417. package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
  418. package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
  419. package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
  420. package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
  421. package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
  422. package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
  423. package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
  424. package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
  425. package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
  426. package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
  427. package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
  428. package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
  429. package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
  430. package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
  431. package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
  432. package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
  433. package/skills/llm-wiki-skill/workbench/README.md +30 -0
  434. package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
  435. package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
  436. package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
  437. package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
  438. package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
  439. package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
  440. package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
  441. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
  442. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
  443. package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
  444. package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
  445. package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
  446. package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
  447. package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
  448. package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
  449. package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
  450. package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
  451. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
  452. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
  453. package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
  454. package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
  455. package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
  456. package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
  457. package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
  458. package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
  459. package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
  460. package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
  461. package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
  462. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
  463. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
  464. package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
  465. package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
  466. package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
  467. package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
  468. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
  469. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
  470. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
  471. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
  472. package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
  473. package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
  474. package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
  475. package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
  476. package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
  477. package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
  478. package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
  479. package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
  480. package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
  481. package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
  482. package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
  483. package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
  484. package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
  485. package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
  486. package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
  487. package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
  488. package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
  489. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
  490. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
  491. package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
  492. package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
  493. package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
  494. package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
  495. package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
  496. package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
  497. package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
  498. package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
  499. package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
  500. package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
  501. package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
  502. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
  503. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
  504. package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
  505. package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
  506. package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
  507. package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
  508. package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
  509. package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
  510. package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
  511. package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
  512. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
  513. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
  514. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
  515. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
  516. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
  517. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
  518. package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
  519. package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
  520. package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
  521. package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
  522. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
  523. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
  524. package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
  525. package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
  526. package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
  527. package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
  528. package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
  529. package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
  530. package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
  531. package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
  532. package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
  533. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
  534. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
  535. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
  536. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
  537. package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
  538. package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
  539. package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
  540. package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
  541. package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
  542. package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
  543. package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
  544. package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
  545. package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
  546. package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
  547. package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
  548. package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
  549. package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
  550. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
  551. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
  552. package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
  553. package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
  554. package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
  555. package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
  556. package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
  557. package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
  558. package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
  559. package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
  560. package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
  561. package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
  562. package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
  563. package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
  564. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
  565. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
  566. package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
  567. package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
  568. package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
  569. package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
@@ -1,6 +1,7 @@
1
1
  import { defineTool } from '@deepseek-ai/dsh-tools';
2
+ import {} from '@deepseek-ai/dsh-util-values';
2
3
  import { can } from '../domain/permissions.js';
3
- import { assertAllowedWikiPagePath } from '../wiki/page-path.js';
4
+ import { assertAllowedWikiPagePath, KB_PAGE_NAMESPACES_HINT } from '../wiki/page-path.js';
4
5
  function guard(action, caller) {
5
6
  if (!can(action, caller.actor, null))
6
7
  throw new Error('permission denied: ' + action);
@@ -34,7 +35,7 @@ export function buildWikiTools(wiki, getCaller) {
34
35
  }),
35
36
  defineTool({
36
37
  name: 'wiki_write',
37
- description: 'Write a wiki-vault page under the configured pagePrefix (W only).',
38
+ description: 'Write a wiki-vault page under projects/<repoSlug>/ namespaces (W only). pagePath must match: ' + KB_PAGE_NAMESPACES_HINT,
38
39
  parameters: {
39
40
  pagePath: { type: 'string', required: true },
40
41
  content: { type: 'string', required: true },
@@ -43,8 +44,8 @@ export function buildWikiTools(wiki, getCaller) {
43
44
  async execute(args) {
44
45
  const caller = getCaller();
45
46
  guard('wiki-write', caller);
46
- // Q3&5:工具边界强校验——只允许 projects/checklists/、projects/ch_*/t_*.md、projects/ch_*/review/
47
- // 三类命名空间(page-path.ts 白名单),杜绝 LLM 自造路径/拼错层级导致 kb_url 无法跳转。
47
+ // Q3&5:工具边界强校验——只允许 projects/<repoSlug>/ 白名单命名空间(KB_PAGE_NAMESPACES_HINT 五类,
48
+ // 见 page-path.ts),杜绝 LLM 自造路径/拼错层级导致 kb_url 无法跳转。
48
49
  assertAllowedWikiPagePath(args.pagePath);
49
50
  const out = await wiki.write(args.pagePath, args.content);
50
51
  // Q4:工具直接拼完整 kb_url(host 用 config.wikiVault.baseUrl,杜绝 LLM 手写错域名)。
@@ -1,9 +1,16 @@
1
- import type { WikiVaultClient } from './wiki-vault-client.js';
2
1
  import type { BoardState } from '../domain/types.js';
2
+ /** kb-linkage 所需最小 wiki 面(WikiVaultClient / LocalWikiClient 均满足,D2 双模式客户端注入)。 */
3
+ type KbWikiClient = {
4
+ read(pagePath: string): Promise<{
5
+ rawMd: string;
6
+ }>;
7
+ write(pagePath: string, content: string): Promise<unknown>;
8
+ };
3
9
  /**
4
10
  * 机械互链登记:链上 w:kb 任务完成时调用。
5
11
  * - 清单页:追加/更新「关联文档」区块,列出链上全部已 done 的 W2/W3 页。
6
12
  * - 当前页:写回清单页链接(清单 ref 来自规格卡 kind:'kb' 附件)。
7
13
  * 幂等(containsLine / 区块就地替换);任何 wiki 读/写失败均静默跳过,不抛错。
8
14
  */
9
- export declare function syncKbLinks(wiki: WikiVaultClient, state: BoardState, taskId: string): Promise<void>;
15
+ export declare function syncKbLinks(wiki: KbWikiClient, state: BoardState, taskId: string): Promise<void>;
16
+ export {};
@@ -49,9 +49,9 @@ export async function syncKbLinks(wiki, state, taskId) {
49
49
  if (!chain?.specCardId)
50
50
  return;
51
51
  const spec = state.specCards.get(chain.specCardId);
52
- // 清单页 ref:kind:'kb' 附件;仅接受 projects/ 命名空间(临时目录兜底路径不是 KB 页,跳过)
52
+ // 清单页 ref:kind:'kb' 附件;接受 projects/(remote)或 wiki/(local)命名空间(临时目录兜底路径不是 KB 页,跳过)
53
53
  const checklistRef = spec?.attachments.find((a) => a.kind === 'kb')?.ref ?? null;
54
- const checklistPath = checklistRef && checklistRef.startsWith('projects/') ? checklistRef : null;
54
+ const checklistPath = checklistRef && (checklistRef.startsWith('projects/') || checklistRef.startsWith('wiki/')) ? checklistRef : null;
55
55
  // 链上已 done 的 W2/W3 页(含当前任务所属页)
56
56
  const pages = [...state.tasks.values()]
57
57
  .filter((t) => t.chainId === task.chainId && t.assignee === 'w' && t.mode === 'kb' && t.status === 'done')
@@ -61,7 +61,7 @@ export async function syncKbLinks(wiki, state, taskId) {
61
61
  ? state.handoffs.get(t.id).metadata.page_path
62
62
  : null,
63
63
  }))
64
- .filter((p) => p.pagePath !== null && p.pagePath.startsWith('projects/'));
64
+ .filter((p) => p.pagePath !== null && (p.pagePath.startsWith('projects/') || p.pagePath.startsWith('wiki/')));
65
65
  if (pages.length === 0)
66
66
  return;
67
67
  // 1) 清单页:登记全部 W2/W3 页链接
@@ -0,0 +1,14 @@
1
+ import { type WikiSearchResult } from './wiki-vault-client.js';
2
+ export declare class LocalWikiClient {
3
+ readonly baseUrl = "";
4
+ readonly root: string;
5
+ constructor(root: string);
6
+ private abs;
7
+ write(pagePath: string, content: string): Promise<{
8
+ path: string;
9
+ }>;
10
+ read(pagePath: string): Promise<{
11
+ rawMd: string;
12
+ }>;
13
+ search(q: string): Promise<WikiSearchResult[]>;
14
+ }
@@ -0,0 +1,101 @@
1
+ // src/wiki/local-kb-client.ts
2
+ // 本地 KB 客户端(llm-wiki 目录结构):与 WikiVaultClient 同构的 search/read/write 面,
3
+ // local 模式下替换注入(planning 工具 / kb-linkage / memory-recall 复用既有逻辑,零分支扩散)。
4
+ // 排序原则 D12:相关性优先 7 : 新鲜度 3(0.7*scoreNorm + 0.3*mtimeNorm)。
5
+ import { readdirSync, readFileSync, writeFileSync, mkdirSync, statSync, existsSync } from 'node:fs';
6
+ import { join, dirname, resolve, sep } from 'node:path';
7
+ import { WikiError } from './wiki-vault-client.js';
8
+ import { isInsideKbRoot } from './local-kb.js';
9
+ import { assertLocalKbPagePath } from './page-path.js';
10
+ export class LocalWikiClient {
11
+ baseUrl = '';
12
+ root;
13
+ constructor(root) { this.root = root; }
14
+ abs(pagePath) {
15
+ assertLocalKbPagePath(pagePath); // Task 1 白名单单一来源(wiki/**、拒 .. 与绝对路径),勿内联重复
16
+ const t = resolve(this.root, pagePath);
17
+ if (!isInsideKbRoot(this.root, t))
18
+ throw new WikiError('kb-rejected', undefined, `kb-rejected: path escapes local KB root: ${pagePath}`);
19
+ return t;
20
+ }
21
+ async write(pagePath, content) {
22
+ const t = this.abs(pagePath);
23
+ try {
24
+ mkdirSync(dirname(t), { recursive: true });
25
+ writeFileSync(t, content, 'utf8');
26
+ }
27
+ catch (err) {
28
+ // §9 降级链依赖:fs 失败归一 kb-unreachable(planning 工具按 code 判定 temp 兜底/软失败,审查 M5)
29
+ throw new WikiError('kb-unreachable', undefined, `kb-unreachable: local KB write failed: ${String(err)}`);
30
+ }
31
+ return { path: pagePath };
32
+ }
33
+ async read(pagePath) {
34
+ const t = this.abs(pagePath);
35
+ if (!existsSync(t))
36
+ throw new WikiError('kb-rejected', undefined, `kb-rejected: page not found: ${pagePath}`);
37
+ try {
38
+ return { rawMd: readFileSync(t, 'utf8') };
39
+ }
40
+ catch (err) {
41
+ throw new WikiError('kb-unreachable', undefined, `kb-unreachable: local KB read failed: ${String(err)}`);
42
+ }
43
+ }
44
+ async search(q) {
45
+ const needle = String(q ?? '').toLowerCase().trim();
46
+ if (!needle)
47
+ return [];
48
+ const hits = [];
49
+ const walk = (dir) => {
50
+ let entries = [];
51
+ try {
52
+ entries = readdirSync(dir);
53
+ }
54
+ catch {
55
+ return;
56
+ }
57
+ for (const e of entries) {
58
+ const p = join(dir, e);
59
+ const st = statSync(p);
60
+ if (st.isDirectory()) {
61
+ walk(p);
62
+ continue;
63
+ }
64
+ if (!e.endsWith('.md'))
65
+ continue;
66
+ let text = '';
67
+ try {
68
+ text = readFileSync(p, 'utf8');
69
+ }
70
+ catch {
71
+ continue;
72
+ }
73
+ const lower = text.toLowerCase();
74
+ const n = lower.split(needle).length - 1;
75
+ if (n === 0)
76
+ continue;
77
+ hits.push({
78
+ path: p.slice(this.root.length + 1).split(sep).join('/'),
79
+ title: text.split('\n')[0]?.replace(/^#\s*/, '').trim() || e,
80
+ score: n,
81
+ mtime: Math.floor(st.mtimeMs / 1000),
82
+ hits: n,
83
+ });
84
+ }
85
+ };
86
+ walk(this.root);
87
+ if (hits.length === 0)
88
+ return [];
89
+ const maxHits = Math.max(...hits.map((h) => h.hits));
90
+ const times = hits.map((h) => h.mtime);
91
+ const minT = Math.min(...times);
92
+ const maxT = Math.max(...times);
93
+ const span = maxT - minT || 1;
94
+ return hits
95
+ .map((h) => ({
96
+ ...h,
97
+ score: Number((0.7 * (h.hits / maxHits) + 0.3 * ((h.mtime - minT) / span)).toFixed(4)),
98
+ }))
99
+ .sort((a, b) => b.score - a.score);
100
+ }
101
+ }
@@ -0,0 +1,6 @@
1
+ export declare function localKbRoot(): string;
2
+ /** 尽力创建库根(幂等);失败由调用方告警 + block(kb-unreachable)(设计 §9)。 */
3
+ export declare function ensureLocalKbRoot(root?: string): string;
4
+ /** target 须为绝对路径且解析后落在 root 内(resolve 折叠重复斜杠;相对路径 fail-closed,
5
+ * 因为 bash/fs 里的相对目标语义属会话 cwd 而非库根,护栏不可猜测)。 */
6
+ export declare function isInsideKbRoot(root: string, target: string): boolean;
@@ -0,0 +1,25 @@
1
+ // src/wiki/local-kb.ts
2
+ // 本地 KB(llm-wiki)库根工具(设计 D4:独立 <DSH_HOME>/storages/kanban/wiki/,隔离用户个人 ~/.llm-wiki-path)。
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve, sep } from 'node:path';
5
+ import { mkdirSync } from 'node:fs';
6
+ export function localKbRoot() {
7
+ const dshHome = process.env.DSH_HOME ?? join(homedir(), '.dsh');
8
+ return join(dshHome, 'storages', 'kanban', 'wiki');
9
+ }
10
+ /** 尽力创建库根(幂等);失败由调用方告警 + block(kb-unreachable)(设计 §9)。 */
11
+ export function ensureLocalKbRoot(root = localKbRoot()) {
12
+ mkdirSync(root, { recursive: true });
13
+ return root;
14
+ }
15
+ /** target 须为绝对路径且解析后落在 root 内(resolve 折叠重复斜杠;相对路径 fail-closed,
16
+ * 因为 bash/fs 里的相对目标语义属会话 cwd 而非库根,护栏不可猜测)。 */
17
+ export function isInsideKbRoot(root, target) {
18
+ if (!target)
19
+ return false;
20
+ // 相对路径 fail-closed:不与 root 拼接猜测(相对目标语义属会话 cwd)
21
+ if (resolve(target) !== target)
22
+ return false;
23
+ const r = resolve(root).replace(/\/+$/, '');
24
+ return resolve(target) === r || resolve(target).startsWith(r + sep);
25
+ }
@@ -0,0 +1,24 @@
1
+ import type { WikiSearchResult } from './wiki-vault-client.js';
2
+ /** KB 客户端最小检索面(WikiVaultClient / LocalWikiClient 均满足)。 */
3
+ type WikiSearchClient = {
4
+ search(q: string): Promise<WikiSearchResult[]>;
5
+ };
6
+ export declare function recallLearningIndex(wiki: WikiSearchClient, opts: {
7
+ requirementName: string | null;
8
+ workspaceDir: string | null;
9
+ kbMode?: 'remote' | 'local';
10
+ }): Promise<WikiSearchResult[]>;
11
+ export declare function recallDocIndex(wiki: WikiSearchClient, opts: {
12
+ requirementName: string | null;
13
+ workspaceDir: string | null;
14
+ kbMode?: 'remote' | 'local';
15
+ }): Promise<WikiSearchResult[]>;
16
+ export declare function recallMemoryIndex(wiki: WikiSearchClient, opts: {
17
+ requirementName: string | null;
18
+ workspaceDir: string | null;
19
+ maxEntries: number;
20
+ kbMode?: 'remote' | 'local';
21
+ }): Promise<string | null>;
22
+ /** /openspec: 恢复路径复用:搜【需求】候选清单页(pagePrefix 前缀 top5;local 调用方传 wiki/queries/checklists/)。 */
23
+ export declare function searchChecklists(wiki: WikiSearchClient, pagePrefix?: string): Promise<string[]>;
24
+ export {};
@@ -0,0 +1,62 @@
1
+ import { buildMemoryIndexBlock, weightedRank, buildRepoSlug } from '../domain/memory.js';
2
+ import { isAllowedWikiPagePath } from './page-path.js';
3
+ const TIMEOUT_MS = 6_000;
4
+ async function withTimeout(p) {
5
+ try {
6
+ return await Promise.race([p, new Promise((resolve) => setTimeout(() => resolve(null), TIMEOUT_MS))]);
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ /** 路1 范围:remote = 当前仓库项目级 learnings(workspaceDir 空 → 无范围匹配;全局 learnings 命名空间已断代);
13
+ * local = wiki/synthesis/learnings/。 */
14
+ function isScopedLearning(path, repoSlug, kbMode = 'remote') {
15
+ if (kbMode === 'local')
16
+ return path.startsWith('wiki/synthesis/learnings/');
17
+ return !!repoSlug && path.startsWith(`projects/${repoSlug}/learnings/`);
18
+ }
19
+ export async function recallLearningIndex(wiki, opts) {
20
+ const repoSlug = opts.workspaceDir ? buildRepoSlug(opts.workspaceDir) : null;
21
+ const kbMode = opts.kbMode ?? 'remote';
22
+ if (opts.requirementName) {
23
+ const r = await withTimeout(wiki.search(opts.requirementName));
24
+ if (!r)
25
+ return [];
26
+ return weightedRank(r.filter((x) => isScopedLearning(x.path, repoSlug, kbMode)), (x) => x.score, (x) => x.mtime);
27
+ }
28
+ const r = await withTimeout(wiki.search('【Learning】'));
29
+ if (!r)
30
+ return [];
31
+ return r.filter((x) => isScopedLearning(x.path, repoSlug, kbMode)).sort((a, b) => b.mtime - a.mtime);
32
+ }
33
+ export async function recallDocIndex(wiki, opts) {
34
+ if (!opts.requirementName)
35
+ return [];
36
+ const r = await withTimeout(wiki.search(opts.requirementName));
37
+ if (!r)
38
+ return [];
39
+ const repoSlug = opts.workspaceDir ? buildRepoSlug(opts.workspaceDir) : null;
40
+ const kbMode = opts.kbMode ?? 'remote';
41
+ return r
42
+ .filter((x) => kbMode === 'local'
43
+ ? x.path.startsWith('wiki/') && !isScopedLearning(x.path, repoSlug, 'local')
44
+ : isAllowedWikiPagePath(x.path) && !isScopedLearning(x.path, repoSlug, 'remote'))
45
+ .sort((a, b) => b.score - a.score);
46
+ }
47
+ export async function recallMemoryIndex(wiki, opts) {
48
+ const [learnings, docs] = await Promise.all([
49
+ recallLearningIndex(wiki, { requirementName: opts.requirementName, workspaceDir: opts.workspaceDir, kbMode: opts.kbMode }),
50
+ recallDocIndex(wiki, { requirementName: opts.requirementName, workspaceDir: opts.workspaceDir, kbMode: opts.kbMode }),
51
+ ]);
52
+ const learningEntries = learnings.slice(0, Math.ceil(opts.maxEntries / 2)).map((r) => ({ kind: 'learning', title: r.title, path: r.path }));
53
+ const docEntries = docs.slice(0, opts.maxEntries - learningEntries.length).map((r) => ({ kind: 'doc', title: r.title, path: r.path }));
54
+ return buildMemoryIndexBlock([...learningEntries, ...docEntries]);
55
+ }
56
+ /** /openspec: 恢复路径复用:搜【需求】候选清单页(pagePrefix 前缀 top5;local 调用方传 wiki/queries/checklists/)。 */
57
+ export async function searchChecklists(wiki, pagePrefix = 'projects/') {
58
+ const r = await withTimeout(wiki.search('【需求】'));
59
+ if (!r)
60
+ return [];
61
+ return r.map((x) => x.path).filter((p) => p.startsWith(pagePrefix)).slice(0, 5);
62
+ }
@@ -1,6 +1,15 @@
1
- export declare const CHECKLIST_PAGE_PREFIX = "projects/checklists/";
1
+ /** 命名空间提示(报错/工具 description 文案单一来源,禁止散落硬编码)。 */
2
+ export declare const KB_PAGE_NAMESPACES_HINT = "projects/<repoSlug>/checklists/\u3001projects/<repoSlug>/learnings/\u3001projects/<repoSlug>/ch_*/learnings/\u3001projects/<repoSlug>/ch_*/t_*.md\u3001projects/<repoSlug>/ch_*/review/";
2
3
  /** 从需求名(回退 problem)派生 URL 安全 slug:ASCII 化、空格/特殊字符→-、限长 40;全非 ASCII(如中文)兜底 'req'。 */
3
4
  export declare function buildChecklistSlug(name: string): string;
4
5
  export declare function isAllowedWikiPagePath(pagePath: string): boolean;
6
+ /** learnings 路径谓词:项目级 / 需求级(均在 repoSlug 下)。 */
7
+ export declare function isLearningsPath(pagePath: string): boolean;
5
8
  /** 工具边界硬校验:不符白名单直接抛 kb-rejected(wiki_write 用)。 */
6
9
  export declare function assertAllowedWikiPagePath(pagePath: string): void;
10
+ export declare const LOCAL_CHECKLIST_PREFIX = "wiki/queries/checklists/";
11
+ export declare const LOCAL_LEARNING_BASE = "wiki/synthesis/learnings/";
12
+ /** 本地模式交付白名单:KB 库根下 wiki/** 相对路径(拒绝对象路径、.. 穿越、空串)。 */
13
+ export declare function isLocalKbPagePath(pagePath: string): boolean;
14
+ /** 本地模式工具边界硬校验:不符直接抛 kb-rejected。 */
15
+ export declare function assertLocalKbPagePath(pagePath: string): void;
@@ -1,12 +1,15 @@
1
1
  // src/wiki/page-path.ts
2
- // Q3&5:KB 页面路径统一规则(单一来源)。三份文档:
3
- // 需求清单 projects/checklists/<slug>-<ts>.md (planning_checklist_save,代码强制)
4
- // 实施计划/结果 projects/ch_<id>/t_<id>.md (W2/W3 wiki_write,工具边界强制)
5
- // DT 评审页 projects/ch_<id>/review/<name>.md (DT wiki_write,工具边界强制)
2
+ // KB 页面路径统一规则(单一来源):一级段 = repoSlug(buildRepoSlug(workspaceDir) 派生),
3
+ // 知识库内按目标仓库分组定位。旧全局命名空间(projects/checklists|learnings|ch_* 直挂根)已断代,不兼容。
4
+ // 需求清单 projects/<repoSlug>/checklists/<slug>-<ts>.md (planning_checklist_save,代码强制)
5
+ // 实施计划/结果 projects/<repoSlug>/ch_<id>/t_<id>.md (W2/W3 wiki_write,工具边界强制)
6
+ // DT 评审页 projects/<repoSlug>/ch_<id>/review/<name>.md (DT wiki_write + 写护栏强制)
7
+ // 经验 projects/<repoSlug>/learnings/、projects/<repoSlug>/ch_<id>/learnings/
6
8
  import { WikiError } from './wiki-vault-client.js';
7
- export const CHECKLIST_PAGE_PREFIX = 'projects/checklists/';
8
- /** 白名单:wiki_write 只允许写这三类命名空间(杜绝 LLM 自造路径/拼错层级)。id 段宽松匹配(兼容真实 nid 两段式 ch_1_xxx 与测试单段 ch_1)。 */
9
- const KB_PAGE_PATH_RE = /^projects\/(?:checklists\/|ch_[0-9a-z_]+\/(?:t_[0-9a-z_]+\.md|review\/))/;
9
+ /** 命名空间提示(报错/工具 description 文案单一来源,禁止散落硬编码)。 */
10
+ export const KB_PAGE_NAMESPACES_HINT = 'projects/<repoSlug>/checklists/、projects/<repoSlug>/learnings/、projects/<repoSlug>/ch_*/learnings/、projects/<repoSlug>/ch_*/t_*.md、projects/<repoSlug>/ch_*/review/';
11
+ /** 白名单:projects/<repoSlug>/ 下五类命名空间(repoSlug=[a-z0-9-]+,杜绝 LLM 自造路径)。 */
12
+ const KB_PAGE_PATH_RE = /^projects\/[a-z0-9-]+\/(?:checklists\/|learnings\/|ch_[0-9a-z_]+\/(?:t_[0-9a-z_]+\.md|review\/|learnings\/))/;
10
13
  /** 从需求名(回退 problem)派生 URL 安全 slug:ASCII 化、空格/特殊字符→-、限长 40;全非 ASCII(如中文)兜底 'req'。 */
11
14
  export function buildChecklistSlug(name) {
12
15
  const slug = name
@@ -20,9 +23,29 @@ export function buildChecklistSlug(name) {
20
23
  export function isAllowedWikiPagePath(pagePath) {
21
24
  return KB_PAGE_PATH_RE.test(pagePath);
22
25
  }
26
+ /** learnings 路径谓词:项目级 / 需求级(均在 repoSlug 下)。 */
27
+ export function isLearningsPath(pagePath) {
28
+ return /^projects\/[a-z0-9-]+\/(?:learnings\/|ch_[0-9a-z_]+\/learnings\/)/.test(pagePath);
29
+ }
23
30
  /** 工具边界硬校验:不符白名单直接抛 kb-rejected(wiki_write 用)。 */
24
31
  export function assertAllowedWikiPagePath(pagePath) {
25
32
  if (!isAllowedWikiPagePath(pagePath)) {
26
- throw new WikiError('kb-rejected', undefined, `page path outside allowed namespaces (projects/checklists/, projects/ch_*/t_*.md, projects/ch_*/review/): ${pagePath}`);
33
+ throw new WikiError('kb-rejected', undefined, `page path outside allowed namespaces (${KB_PAGE_NAMESPACES_HINT}): ${pagePath}`);
34
+ }
35
+ }
36
+ // ── 本地 KB(llm-wiki)路径规则(双模式 D5/D9)──────────────────────────────
37
+ export const LOCAL_CHECKLIST_PREFIX = 'wiki/queries/checklists/';
38
+ export const LOCAL_LEARNING_BASE = 'wiki/synthesis/learnings/';
39
+ /** 本地模式交付白名单:KB 库根下 wiki/** 相对路径(拒绝对象路径、.. 穿越、空串)。 */
40
+ export function isLocalKbPagePath(pagePath) {
41
+ const p = String(pagePath ?? '');
42
+ if (!p || p.startsWith('/') || p.includes('..'))
43
+ return false;
44
+ return p.startsWith('wiki/');
45
+ }
46
+ /** 本地模式工具边界硬校验:不符直接抛 kb-rejected。 */
47
+ export function assertLocalKbPagePath(pagePath) {
48
+ if (!isLocalKbPagePath(pagePath)) {
49
+ throw new WikiError('kb-rejected', undefined, `kb-rejected: local KB page path outside wiki/**: ${pagePath}`);
27
50
  }
28
51
  }
@@ -7,14 +7,15 @@ export interface WikiSearchResult {
7
7
  path: string;
8
8
  title: string;
9
9
  score: number;
10
+ mtime: number;
10
11
  }
11
12
  export declare class WikiVaultClient {
12
- private readonly cfg;
13
- constructor(cfg: {
13
+ private readonly getCfg;
14
+ constructor(getCfg: () => {
14
15
  baseUrl: string;
15
16
  pagePrefix: string;
16
17
  });
17
- /** P2:暴露 baseUrl getter(下游 WikiWorker 拼 kb_url 用),不挖私有字段。 */
18
+ /** P2:暴露 baseUrl getter(下游 WikiWorker 拼 kb_url 用),不挖私有字段;经 getCfg 每次取最新配置(热生效)。 */
18
19
  get baseUrl(): string;
19
20
  private request;
20
21
  search(q: string): Promise<WikiSearchResult[]>;
@@ -9,12 +9,12 @@ export class WikiError extends Error {
9
9
  }
10
10
  }
11
11
  export class WikiVaultClient {
12
- cfg;
13
- constructor(cfg) { this.cfg = cfg; }
14
- /** P2:暴露 baseUrl getter(下游 WikiWorker 拼 kb_url 用),不挖私有字段。 */
15
- get baseUrl() { return this.cfg.baseUrl; }
12
+ getCfg;
13
+ constructor(getCfg) { this.getCfg = getCfg; }
14
+ /** P2:暴露 baseUrl getter(下游 WikiWorker 拼 kb_url 用),不挖私有字段;经 getCfg 每次取最新配置(热生效)。 */
15
+ get baseUrl() { return this.getCfg().baseUrl; }
16
16
  async request(method, path, body) {
17
- const url = this.cfg.baseUrl.replace(/\/$/, '') + path;
17
+ const url = this.getCfg().baseUrl.replace(/\/$/, '') + path;
18
18
  let res;
19
19
  try {
20
20
  res = await fetch(url, {
@@ -39,7 +39,7 @@ export class WikiVaultClient {
39
39
  return this.request('GET', '/api/pages/' + encodeURIComponent(pagePath));
40
40
  }
41
41
  async write(pagePath, content) {
42
- if (!pagePath.startsWith(this.cfg.pagePrefix)) {
42
+ if (!pagePath.startsWith(this.getCfg().pagePrefix)) {
43
43
  throw new WikiError('kb-rejected', undefined, 'page path outside prefix: ' + pagePath);
44
44
  }
45
45
  await this.request('PUT', '/api/pages/' + encodeURIComponent(pagePath), { content });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joekytc/dsh-swarm",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "A governed swarm of six specialist DSH agents (orchestrator, planner, knowledge-base bridge, developer and two reviewers) that turns a requirement into a strict phase pipeline with machine-verified delivery evidence, review-gated merges, a full audit-log event stream and a live kanban tab; design inspired by the Hermes Agent kanban",
5
5
  "license": "MIT",
6
6
  "author": "joekytc",
@@ -23,6 +23,7 @@
23
23
  "lib",
24
24
  "client",
25
25
  "personas",
26
+ "skills",
26
27
  "cordis.patch.yml"
27
28
  ],
28
29
  "dsh": {
@@ -55,25 +56,29 @@
55
56
  },
56
57
  "peerDependencies": {
57
58
  "@deepseek-ai/cordis": "^4.0.1",
58
- "@deepseek-ai/dsh-agent": "^0.1.0-rc.6",
59
- "@deepseek-ai/dsh-persona": "^0.1.0-rc.6",
60
- "@deepseek-ai/dsh-session": "^0.1.0-rc.6",
61
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
62
- "@deepseek-ai/dsh-tool-bash": "^0.1.0-rc.6",
63
- "@deepseek-ai/dsh-tool-fs": "^0.1.0-rc.6",
64
- "@deepseek-ai/dsh-tool-fs-search": "^0.1.0-rc.6",
59
+ "@deepseek-ai/dsh-agent": "^0.1.2-rc.1",
60
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.2-rc.1",
61
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-rc.1",
62
+ "@deepseek-ai/dsh-persona": "^0.1.2-rc.1",
63
+ "@deepseek-ai/dsh-session": "^0.1.2-rc.1",
64
+ "@deepseek-ai/dsh-tool-bash": "^0.1.2-rc.1",
65
+ "@deepseek-ai/dsh-tool-fs": "^0.1.2-rc.1",
66
+ "@deepseek-ai/dsh-tool-fs-search": "^0.1.2-rc.1",
67
+ "@deepseek-ai/dsh-tools": "^0.1.2-rc.1",
68
+ "@deepseek-ai/dsh-util-values": "^0.1.2-rc.1",
65
69
  "@deepseek-ai/schemastery": "^3.18.1"
66
70
  },
67
71
  "devDependencies": {
68
- "@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.6",
69
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.0-rc.6",
70
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
72
+ "@deepseek-ai/dsh-client-store": "^0.1.2-rc.1",
73
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.2-rc.1",
74
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-rc.1",
71
75
  "@testing-library/dom": "^10.4.0",
72
76
  "@testing-library/react": "^16.1.0",
73
77
  "@types/node": "^22.0.0",
74
78
  "@types/react": "^18.3.0",
75
79
  "@types/react-dom": "^18.3.0",
76
80
  "esbuild": "^0.28.2",
81
+ "js-yaml": "^4.3.2",
77
82
  "jsdom": "^25.0.0",
78
83
  "react": "^18.3.1",
79
84
  "react-dom": "^18.3.1",
@@ -1,2 +1,2 @@
1
- name: 全栈开发(D)
1
+ name: 全栈开发官(D)
2
2
  description: 看板链唯一执行者,在目标仓库实现并自测规格、提交带 git 证据的交付,不再向下派单。
@@ -31,8 +31,8 @@
31
31
  <branch>, delegation mode; <branch> = D's feature branch from the parent handoff
32
32
  metadata.branch) → fallback superpowers code-review when ocr is unavailable →
33
33
  kanban_block('review-tool-unavailable') only when both are unavailable.
34
- 4. Wiki is read-only plus writes limited to projects/<chain>/review/ namespace (review
35
- conclusion/evidence chain — does not replace W's artifact sync duty).
34
+ 4. Wiki writes only under the whitelisted projects/<repoSlug>/<chain>/review/ namespace
35
+ (repoSlug is derived from the chain workspaceDir).
36
36
  5. Write the review conclusion into kanban_complete metadata review_evidence =
37
37
  { verdict: 'pass'|'fail', issues: [...], test/build/typecheck/lint/diff/git/
38
38
  openCodeReview/reviewPage }: pass = all six checks pass (system advances to W3);
@@ -59,7 +59,7 @@
59
59
 
60
60
  # run_code 供验证程序(跑测试/构建/typecheck 编排);ToolGuard 拦其对源码的写
61
61
  - id: tool-presentation
62
- name: '@deepseek-ai/dsh-tool-presentation'
62
+ name: '@deepseek-ai/dsh-agent-tool-presentation'
63
63
  config:
64
64
  mode: both
65
65
 
@@ -1,2 +1,2 @@
1
- name: 交付评审(DT)
1
+ name: 交付评审官(DT)
2
2
  description: 只读校验 D 的实现(测试/构建/diff/规格对齐/代码评审)并出具结论,绝不修改源码。
@@ -44,6 +44,22 @@
44
44
  needed=true. needed=true means V creates a PT (plan review) card attaching your reason;
45
45
  needed=false skips PT straight to W2. This is the only input the system uses to decide
46
46
  whether a PT card is created.
47
+ 7. This session runs at danger-full-access (the permission ceiling): when calling write/
48
+ edit you MUST NOT attach the `sandbox_permissions` parameter — every value is rejected
49
+ by the sandbox (escalation only accepts strictly wider modes, and none exists above the
50
+ ceiling). Write directly with file_path + content only; never retry a denied call with
51
+ the parameter attached.
52
+ 8. tasks.md splitting granularity (structural readiness — the SAME criterion as PT,
53
+ self-contained, zero external dependency): every task entry must have a SINGLE,
54
+ independently checkable done criterion; NEVER let one task's steps achieve N>=2 mutually
55
+ independent observable results, or one test case assert N>=2 mutually independent
56
+ observable results — split per independently verifiable behavior (one task / one test
57
+ case per behavior).
58
+ 9. proposal.md MUST contain a 「上游协议遵循说明」 section: list every engineering-protocol
59
+ reference declared in the spec card / clarification checklist (locatable origin: path or
60
+ explicit protocol name) and how the plan complies with it; if no protocol is declared,
61
+ write 「无」 in that section. Never reference protocol standards beyond the spec card
62
+ (read the declared files themselves, never secondhand summaries).
47
63
 
48
64
  - id: agent-instructions
49
65
  name: '@deepseek-ai/dsh-agent-instructions'
@@ -1,2 +1,2 @@
1
- name: 规划师(P)
1
+ name: 规划官(P)
2
2
  description: 仅依据需求卡与注入上下文产出 openspec 实施计划,不探索仓库、不执行任何开发动作。
@@ -13,19 +13,49 @@
13
13
  You are the plan-review agent (read-only) powered by the {{model}} model. Your working
14
14
  directory is {{cwd}}. You review P's plan deliverable only — you never modify any artifact
15
15
  and you never execute code. Rules:
16
- 1. Read-only review of the P plan (proposal/design/tasks, from the handoff artifacts_path):
17
- check requirement alignment (spec problem/user_stories), completeness (solution/
18
- impl_decisions coverage) and logical/interaction consistency (internally coherent,
19
- executable).
16
+ 1. Read-only review of the P plan (proposal/design/tasks, from the handoff artifacts_path)
17
+ against five elements:
18
+ - Requirement alignment (granularity): every task item / task point / note in the
19
+ clarification checklist / spec card maps both ways to plan tasks — nothing missing,
20
+ nothing beyond scope (an out-of-scope task must trace back to a clarification answer,
21
+ else issue).
22
+ - Completeness: solution/impl_decisions cover all requirement points; every task has a
23
+ checkable done criterion.
24
+ - Logical/interaction consistency: no internal contradictions; slice/task dependency
25
+ order is executable.
26
+ - Structural readiness (self-contained rule, zero external skill dependency): every task
27
+ entry must have a SINGLE, independently checkable done criterion; if one task's steps
28
+ achieve N>=2 mutually independent observable results, or one test case asserts N>=2
29
+ mutually independent observable results, it is a "mixed behavior" — issue requires a
30
+ split. Judge from the plan text only; never reference or require execution-layer wording
31
+ (RED/GREEN/named narrow tests).
32
+ - Engineering-protocol consistency: only reconcile against the 「上游协议遵循说明」
33
+ section of proposal.md; the only judge reference is the file declared upstream; you have
34
+ no authority to introduce undeclared protocols (never scan repo skills as review
35
+ standards).
20
36
  2. A read-only ToolGuard blocks tracked-source writes, git mutations, and write-marker
21
37
  bash targeting the repo — do not attempt them; use read-only commands (cat/git show/glob).
22
38
  3. Write the review conclusion into kanban_complete metadata review_evidence =
23
39
  { verdict: 'pass'|'fail', issues: [{ severity, title, detail, location?, resolved }], ... }:
24
- pass = plan satisfies the three checks above; fail = critical/high issues remain (the
25
- system then creates a rework task for P and a fresh review card).
26
- 4. Never call kanban_create, never write the wiki, never edit/approve spec cards; only
40
+ every issue MUST carry four elements — location (which task/section) + basis (upstream
41
+ declaration reference or internal contradiction) + problem (what is violated) + fix
42
+ (actionable suggestion); missing any element = invalid issue.
43
+ pass = all five elements satisfied; issues may then only carry non-blocking suggestions
44
+ (execution-layer reference, not blocking). fail = critical/high issues remain (the system
45
+ then creates a rework task for P and a fresh review card).
46
+ Review gate hard requirement: on complete, the handoff metadata must carry artifacts_path =
47
+ <absolute path of the reviewed plan's openspec directory, inherited directly from the
48
+ reviewed P card's handoff artifacts_path value>, or set reviewPage inside review_evidence;
49
+ review_evidence shape stays { verdict, issues, ...reviewPage optional } — the review gate
50
+ rejects pass when both artifacts_path and reviewPage are missing.
51
+ 4. Re-review (task body contains the 「上一轮评审未通过 issues」 section): reconcile FIRST —
52
+ each prior issue gets a three-state conclusion (fixed resolved=true / unfixed resolved=false
53
+ carried over as-is / partially fixed resolved=false with the remaining part in detail), then
54
+ raise new issues; unfixed prior issues MUST stay in the issues list. Never skip
55
+ reconciliation and only raise new issues.
56
+ 5. Never call kanban_create, never write the wiki, never edit/approve spec cards; only
27
57
  complete/block/comment your own bound task.
28
- 5. Use kanban_show/kanban_list/kanban_complete/kanban_block/kanban_heartbeat/
58
+ 6. Use kanban_show/kanban_list/kanban_complete/kanban_block/kanban_heartbeat/
29
59
  kanban_comment + spec_card_view; bash limited to read-only commands.
30
60
 
31
61
  - id: agent-instructions
@@ -1,2 +1,2 @@
1
- name: 计划评审(PT)
1
+ name: 计划审查官(PT)
2
2
  description: 只读评审 P 产出的实施计划,输出通过/打回结论,不修改任何产物、不执行代码。