@joekytc/dsh-swarm 0.1.2 → 0.3.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 (603) hide show
  1. package/README.md +177 -140
  2. package/README.zh-CN.md +173 -126
  3. package/client/BoardCard.tsx +24 -2
  4. package/client/ConfigSection.tsx +162 -0
  5. package/client/ConfigSelect.tsx +71 -0
  6. package/client/KanbanBoard.tsx +3 -0
  7. package/client/KanbanTab.tsx +4 -3
  8. package/client/TaskDrawer.tsx +4 -26
  9. package/client/WorkflowRail.tsx +3 -1
  10. package/client/config-store.ts +92 -0
  11. package/client/config.css +110 -0
  12. package/client/index.ts +39 -4
  13. package/client/kanban.css +88 -2
  14. package/client/session-bridge.ts +39 -0
  15. package/client/timeline-model.ts +12 -1
  16. package/client/workflow-model.ts +3 -1
  17. package/lib/client.js +519 -56
  18. package/lib/config.d.ts +26 -2
  19. package/lib/config.js +20 -1
  20. package/lib/dispatcher/agent-runner.d.ts +37 -7
  21. package/lib/dispatcher/agent-runner.js +239 -86
  22. package/lib/dispatcher/chain-auditor.d.ts +4 -4
  23. package/lib/dispatcher/chain-auditor.js +14 -9
  24. package/lib/dispatcher/dispatcher.d.ts +69 -10
  25. package/lib/dispatcher/dispatcher.js +281 -42
  26. package/lib/dispatcher/event-waker.d.ts +1 -1
  27. package/lib/dispatcher/event-waker.js +2 -2
  28. package/lib/dispatcher/git-credentials.d.ts +2 -2
  29. package/lib/dispatcher/git-credentials.js +2 -2
  30. package/lib/dispatcher/model-candidates.d.ts +1 -1
  31. package/lib/dispatcher/model-candidates.js +1 -1
  32. package/lib/dispatcher/session-events.d.ts +12 -16
  33. package/lib/dispatcher/session-events.js +18 -6
  34. package/lib/dispatcher/target-repo.d.ts +2 -2
  35. package/lib/dispatcher/target-repo.js +3 -3
  36. package/lib/dispatcher/v-orchestrator.d.ts +44 -11
  37. package/lib/dispatcher/v-orchestrator.js +257 -49
  38. package/lib/dispatcher/watchdog.d.ts +1 -1
  39. package/lib/dispatcher/watchdog.js +2 -2
  40. package/lib/domain/config-override.d.ts +52 -0
  41. package/lib/domain/config-override.js +138 -0
  42. package/lib/domain/delivery-contract.d.ts +4 -3
  43. package/lib/domain/delivery-contract.js +30 -18
  44. package/lib/domain/delivery-evidence.d.ts +1 -1
  45. package/lib/domain/delivery-evidence.js +1 -1
  46. package/lib/domain/event-store.js +1 -1
  47. package/lib/domain/gate-policy.d.ts +26 -0
  48. package/lib/domain/gate-policy.js +44 -0
  49. package/lib/domain/im-message.d.ts +15 -0
  50. package/lib/domain/im-message.js +149 -0
  51. package/lib/domain/kanban-service.d.ts +28 -12
  52. package/lib/domain/kanban-service.js +73 -30
  53. package/lib/domain/memory.js +1 -1
  54. package/lib/domain/ocr-review.d.ts +47 -0
  55. package/lib/domain/ocr-review.js +105 -0
  56. package/lib/domain/permissions.js +6 -6
  57. package/lib/domain/planning-checklist.d.ts +5 -0
  58. package/lib/domain/planning-checklist.js +80 -6
  59. package/lib/domain/projection.js +8 -7
  60. package/lib/domain/review-evidence.js +1 -1
  61. package/lib/domain/state-machine.js +3 -2
  62. package/lib/domain/task-parents.js +1 -1
  63. package/lib/domain/types.d.ts +5 -5
  64. package/lib/index.js +28 -25
  65. package/lib/roles/clean-fs-tools.d.ts +22 -0
  66. package/lib/roles/clean-fs-tools.js +117 -0
  67. package/lib/roles/preset-installer.js +3 -3
  68. package/lib/roles/skill-installer.d.ts +6 -0
  69. package/lib/roles/skill-installer.js +32 -0
  70. package/lib/roles/toolsets.d.ts +71 -15
  71. package/lib/roles/toolsets.js +418 -68
  72. package/lib/roles/wiki-worker.d.ts +1 -0
  73. package/lib/roles/wiki-worker.js +12 -4
  74. package/lib/routes/kanban-http.d.ts +28 -2
  75. package/lib/routes/kanban-http.js +199 -6
  76. package/lib/routes/kanban-sse.d.ts +1 -1
  77. package/lib/routes/kanban-sse.js +1 -1
  78. package/lib/routes/planning-driver.d.ts +6 -2
  79. package/lib/routes/planning-driver.js +15 -7
  80. package/lib/routes/prefix-router.d.ts +19 -3
  81. package/lib/routes/prefix-router.js +40 -3
  82. package/lib/services/config-provider.d.ts +38 -0
  83. package/lib/services/config-provider.js +92 -0
  84. package/lib/services/gate-runner.d.ts +24 -0
  85. package/lib/services/gate-runner.js +87 -0
  86. package/lib/services/im-delivery.d.ts +94 -0
  87. package/lib/services/im-delivery.js +263 -0
  88. package/lib/services/kanban-provider.d.ts +6 -2
  89. package/lib/services/kanban-provider.js +41 -3
  90. package/lib/services/llm-catalog.d.ts +35 -0
  91. package/lib/services/llm-catalog.js +19 -0
  92. package/lib/services/ocr-cli.d.ts +35 -0
  93. package/lib/services/ocr-cli.js +128 -0
  94. package/lib/tools/kanban-tools.d.ts +2 -2
  95. package/lib/tools/kanban-tools.js +2 -1
  96. package/lib/tools/main-session-tools.d.ts +22 -3
  97. package/lib/tools/main-session-tools.js +135 -30
  98. package/lib/tools/ocr-review-tools.d.ts +11 -0
  99. package/lib/tools/ocr-review-tools.js +63 -0
  100. package/lib/tools/planning-tools.d.ts +8 -1
  101. package/lib/tools/planning-tools.js +44 -15
  102. package/lib/tools/prefetch-tools.js +1 -0
  103. package/lib/tools/spec-card-tools.js +1 -0
  104. package/lib/tools/wiki-tools.js +6 -5
  105. package/lib/wiki/kb-linkage.d.ts +9 -2
  106. package/lib/wiki/kb-linkage.js +3 -3
  107. package/lib/wiki/local-kb-client.d.ts +14 -0
  108. package/lib/wiki/local-kb-client.js +101 -0
  109. package/lib/wiki/local-kb.d.ts +6 -0
  110. package/lib/wiki/local-kb.js +25 -0
  111. package/lib/wiki/memory-recall.d.ts +14 -6
  112. package/lib/wiki/memory-recall.js +17 -13
  113. package/lib/wiki/page-path.d.ts +9 -3
  114. package/lib/wiki/page-path.js +33 -12
  115. package/lib/wiki/wiki-vault-client.d.ts +3 -3
  116. package/lib/wiki/wiki-vault-client.js +6 -6
  117. package/package.json +16 -11
  118. package/personas/kanban-d/agent.cordis.yml +5 -5
  119. package/personas/kanban-d/preset.yml +1 -1
  120. package/personas/kanban-dt/agent.cordis.yml +25 -7
  121. package/personas/kanban-dt/preset.yml +1 -1
  122. package/personas/kanban-p/agent.cordis.yml +19 -3
  123. package/personas/kanban-p/preset.yml +1 -1
  124. package/personas/kanban-pt/agent.cordis.yml +39 -9
  125. package/personas/kanban-pt/preset.yml +1 -1
  126. package/personas/kanban-v/agent.cordis.yml +3 -3
  127. package/personas/kanban-w/agent.cordis.yml +37 -18
  128. package/personas/kanban-w/preset.yml +1 -1
  129. package/personas/persona-d.md +1 -1
  130. package/personas/persona-dt.md +13 -5
  131. package/personas/persona-p.md +5 -2
  132. package/personas/persona-pt.md +13 -6
  133. package/personas/persona-v.md +2 -2
  134. package/personas/persona-w.md +11 -9
  135. package/personas/swarm/agent.cordis.yml +43 -0
  136. package/personas/swarm/preset.yml +5 -0
  137. package/skills/grill-me/SKILL.md +71 -0
  138. package/skills/llm-wiki-skill/.mise.toml +2 -0
  139. package/skills/llm-wiki-skill/.nvmrc +1 -0
  140. package/skills/llm-wiki-skill/AGENTS.md +173 -0
  141. package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
  142. package/skills/llm-wiki-skill/CLAUDE.md +152 -0
  143. package/skills/llm-wiki-skill/HERMES.md +44 -0
  144. package/skills/llm-wiki-skill/README.en.md +261 -0
  145. package/skills/llm-wiki-skill/README.md +291 -0
  146. package/skills/llm-wiki-skill/SKILL.md +1133 -0
  147. package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
  148. package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
  149. package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
  150. package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
  151. package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
  152. package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
  153. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
  154. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
  155. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
  156. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
  157. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
  158. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
  159. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
  160. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
  161. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
  162. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
  163. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
  164. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
  165. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
  166. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
  167. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
  168. package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
  169. package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
  170. package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
  171. package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
  172. package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
  173. package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
  174. package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
  175. package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
  176. package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
  177. package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
  178. package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
  179. package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
  180. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
  181. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
  182. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
  183. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
  184. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
  185. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
  186. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
  187. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
  188. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
  189. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
  190. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
  191. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
  192. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
  193. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
  194. package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
  195. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
  196. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
  197. package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
  198. package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
  199. package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
  200. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
  201. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
  202. package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
  203. package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
  204. package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
  205. package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
  206. package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
  207. package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
  208. package/skills/llm-wiki-skill/install.ps1 +87 -0
  209. package/skills/llm-wiki-skill/install.sh +722 -0
  210. package/skills/llm-wiki-skill/package-lock.json +11171 -0
  211. package/skills/llm-wiki-skill/package.json +24 -0
  212. package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
  213. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
  214. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
  215. package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
  216. package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
  217. package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
  218. package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
  219. package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
  220. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
  221. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
  222. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
  223. package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
  224. package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
  225. package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
  226. package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
  227. package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
  228. package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
  229. package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
  230. package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
  231. package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
  232. package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
  233. package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
  234. package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
  235. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
  236. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
  237. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
  238. package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
  239. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
  240. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
  241. package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
  242. package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
  243. package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
  244. package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
  245. package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
  246. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
  247. package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
  248. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
  249. package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
  250. package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
  251. package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
  252. package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
  253. package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
  254. package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
  255. package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
  256. package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
  257. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
  258. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
  259. package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
  260. package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
  261. package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
  262. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
  263. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
  264. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
  265. package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
  266. package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
  267. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
  268. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
  269. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
  270. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
  271. package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
  272. package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
  273. package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
  274. package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
  275. package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
  276. package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
  277. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
  278. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
  279. package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
  280. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
  281. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
  282. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
  283. package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
  284. package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
  285. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
  286. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
  287. package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
  288. package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
  289. package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
  290. package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
  291. package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
  292. package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
  293. package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
  294. package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
  295. package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
  296. package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
  297. package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
  298. package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
  299. package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
  300. package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
  301. package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
  302. package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
  303. package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
  304. package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
  305. package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
  306. package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
  307. package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
  308. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
  309. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
  310. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
  311. package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
  312. package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
  313. package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
  314. package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
  315. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
  316. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
  317. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
  318. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
  319. package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
  320. package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
  321. package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
  322. package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
  323. package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
  324. package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
  325. package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
  326. package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
  327. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
  328. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
  329. package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
  330. package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
  331. package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
  332. package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
  333. package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
  334. package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
  335. package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
  336. package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
  337. package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
  338. package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
  339. package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
  340. package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
  341. package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
  342. package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
  343. package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
  344. package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
  345. package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
  346. package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
  347. package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
  348. package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
  349. package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
  350. package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
  351. package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
  352. package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
  353. package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
  354. package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
  355. package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
  356. package/skills/llm-wiki-skill/setup.sh +8 -0
  357. package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
  358. package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
  359. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
  360. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
  361. package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
  362. package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
  363. package/skills/llm-wiki-skill/templates/index-template.md +51 -0
  364. package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
  365. package/skills/llm-wiki-skill/templates/log-template.md +11 -0
  366. package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
  367. package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
  368. package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
  369. package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
  370. package/skills/llm-wiki-skill/templates/query-template.md +19 -0
  371. package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
  372. package/skills/llm-wiki-skill/templates/source-template.md +51 -0
  373. package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
  374. package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
  375. package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
  376. package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
  377. package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
  378. package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
  379. package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
  380. package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
  381. package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
  382. package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
  383. package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
  384. package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
  385. package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
  386. package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
  387. package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
  388. package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
  389. package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
  390. package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
  391. package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
  392. package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
  393. package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
  394. package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
  395. package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
  396. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
  397. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
  398. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
  399. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
  400. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
  401. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
  402. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
  403. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
  404. package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
  405. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
  406. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
  407. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
  408. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
  409. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
  410. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
  411. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
  412. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
  413. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
  414. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
  415. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
  416. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
  417. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
  418. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
  419. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
  420. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
  421. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
  422. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
  423. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
  424. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
  425. package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
  426. package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
  427. package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
  428. package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
  429. package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
  430. package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
  431. package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
  432. package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
  433. package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
  434. package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
  435. package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
  436. package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
  437. package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
  438. package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
  439. package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
  440. package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
  441. package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
  442. package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
  443. package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
  444. package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
  445. package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
  446. package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
  447. package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
  448. package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
  449. package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
  450. package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
  451. package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
  452. package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
  453. package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
  454. package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
  455. package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
  456. package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
  457. package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
  458. package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
  459. package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
  460. package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
  461. package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
  462. package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
  463. package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
  464. package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
  465. package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
  466. package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
  467. package/skills/llm-wiki-skill/workbench/README.md +30 -0
  468. package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
  469. package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
  470. package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
  471. package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
  472. package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
  473. package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
  474. package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
  475. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
  476. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
  477. package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
  478. package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
  479. package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
  480. package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
  481. package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
  482. package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
  483. package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
  484. package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
  485. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
  486. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
  487. package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
  488. package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
  489. package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
  490. package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
  491. package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
  492. package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
  493. package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
  494. package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
  495. package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
  496. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
  497. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
  498. package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
  499. package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
  500. package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
  501. package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
  502. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
  503. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
  504. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
  505. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
  506. package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
  507. package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
  508. package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
  509. package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
  510. package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
  511. package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
  512. package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
  513. package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
  514. package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
  515. package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
  516. package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
  517. package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
  518. package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
  519. package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
  520. package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
  521. package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
  522. package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
  523. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
  524. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
  525. package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
  526. package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
  527. package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
  528. package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
  529. package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
  530. package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
  531. package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
  532. package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
  533. package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
  534. package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
  535. package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
  536. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
  537. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
  538. package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
  539. package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
  540. package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
  541. package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
  542. package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
  543. package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
  544. package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
  545. package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
  546. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
  547. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
  548. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
  549. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
  550. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
  551. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
  552. package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
  553. package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
  554. package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
  555. package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
  556. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
  557. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
  558. package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
  559. package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
  560. package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
  561. package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
  562. package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
  563. package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
  564. package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
  565. package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
  566. package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
  567. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
  568. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
  569. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
  570. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
  571. package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
  572. package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
  573. package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
  574. package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
  575. package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
  576. package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
  577. package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
  578. package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
  579. package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
  580. package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
  581. package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
  582. package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
  583. package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
  584. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
  585. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
  586. package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
  587. package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
  588. package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
  589. package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
  590. package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
  591. package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
  592. package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
  593. package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
  594. package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
  595. package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
  596. package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
  597. package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
  598. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
  599. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
  600. package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
  601. package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
  602. package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
  603. package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
@@ -0,0 +1,138 @@
1
+ export const ROLES = ['v', 'p', 'w', 'd', 'pt', 'dt'];
2
+ const MODEL_FIELDS = ['provider', 'model', 'reasoningEffort'];
3
+ export function mergeConfig(baseline, override) {
4
+ const wiki = { ...baseline.wikiVault };
5
+ if (override?.wikiVault?.baseUrl !== undefined)
6
+ wiki.baseUrl = override.wikiVault.baseUrl;
7
+ if (override?.wikiVault?.pagePrefix !== undefined)
8
+ wiki.pagePrefix = override.wikiVault.pagePrefix;
9
+ const reviewEngine = {
10
+ mode: baseline.reviewEngine?.mode ?? 'delegate',
11
+ managed: { provider: baseline.reviewEngine?.managed?.provider ?? '', model: baseline.reviewEngine?.managed?.model ?? '' },
12
+ };
13
+ if (override?.reviewEngine?.mode !== undefined)
14
+ reviewEngine.mode = override.reviewEngine.mode;
15
+ if (override?.reviewEngine?.managed?.provider !== undefined)
16
+ reviewEngine.managed.provider = override.reviewEngine.managed.provider;
17
+ if (override?.reviewEngine?.managed?.model !== undefined)
18
+ reviewEngine.managed.model = override.reviewEngine.managed.model;
19
+ const models = { ...baseline.roles.models };
20
+ for (const role of ROLES) {
21
+ const base = baseline.roles.models?.[role];
22
+ const over = override?.roles?.models?.[role];
23
+ if (!over)
24
+ continue;
25
+ const cur = { ...base };
26
+ if (over.provider !== undefined)
27
+ cur.provider = over.provider;
28
+ if (over.model !== undefined)
29
+ cur.model = over.model;
30
+ // 防御:空字符串 reasoningEffort 视为"未设置",永不覆盖 baseline/默认(读点回退 'high')。
31
+ if (over.reasoningEffort !== undefined && over.reasoningEffort.trim() !== '')
32
+ cur.reasoningEffort = over.reasoningEffort;
33
+ if (cur.provider && cur.model)
34
+ models[role] = cur;
35
+ }
36
+ return { ...baseline, wikiVault: wiki, roles: { ...baseline.roles, models }, reviewEngine };
37
+ }
38
+ export function computeSources(override) {
39
+ const src = {};
40
+ for (const k of ['wikiVault.baseUrl', 'wikiVault.pagePrefix']) {
41
+ const hit = k === 'wikiVault.baseUrl' ? override?.wikiVault?.baseUrl !== undefined : override?.wikiVault?.pagePrefix !== undefined;
42
+ src[k] = hit ? 'override' : 'inherited';
43
+ }
44
+ for (const role of ROLES) {
45
+ for (const f of MODEL_FIELDS) {
46
+ const hit = override?.roles?.models?.[role]?.[f] !== undefined;
47
+ src[`roles.models.${role}.${f}`] = hit ? 'override' : 'inherited';
48
+ }
49
+ }
50
+ src['reviewEngine.mode'] = override?.reviewEngine?.mode !== undefined ? 'override' : 'inherited';
51
+ src['reviewEngine.managed.provider'] = override?.reviewEngine?.managed?.provider !== undefined ? 'override' : 'inherited';
52
+ src['reviewEngine.managed.model'] = override?.reviewEngine?.managed?.model !== undefined ? 'override' : 'inherited';
53
+ return src;
54
+ }
55
+ export function projectEditable(effective) {
56
+ const models = {};
57
+ for (const role of ROLES) {
58
+ const m = effective.roles.models?.[role];
59
+ if (m?.provider && m?.model)
60
+ models[role] = { provider: m.provider, model: m.model, reasoningEffort: m.reasoningEffort ?? 'high' };
61
+ }
62
+ return {
63
+ wikiVault: { baseUrl: effective.wikiVault.baseUrl, pagePrefix: effective.wikiVault.pagePrefix },
64
+ roles: { models },
65
+ reviewEngine: {
66
+ mode: effective.reviewEngine?.mode ?? 'delegate',
67
+ managed: { provider: effective.reviewEngine?.managed?.provider ?? '', model: effective.reviewEngine?.managed?.model ?? '' },
68
+ },
69
+ };
70
+ }
71
+ export function validateConfig(snapshot) {
72
+ const errs = [];
73
+ const baseUrl = snapshot.wikiVault.baseUrl ?? '';
74
+ // 空 baseUrl = 本地 llm-wiki 回退(合法);仅非空时校验 ^https?://。
75
+ if (baseUrl.trim() && !/^https?:\/\//.test(baseUrl))
76
+ errs.push('wikiVault.baseUrl');
77
+ if (!(snapshot.wikiVault.pagePrefix ?? '').trim())
78
+ errs.push('wikiVault.pagePrefix');
79
+ // 就绪性(managed provider/model 是否已配好)是运行时探测,不在此校验;仅 mode 枚举把关。
80
+ const reMode = snapshot.reviewEngine?.mode;
81
+ if (reMode !== 'delegate' && reMode !== 'managed')
82
+ errs.push('reviewEngine.mode');
83
+ for (const role of ROLES) {
84
+ const m = snapshot.roles.models[role];
85
+ if (!m)
86
+ continue;
87
+ if (!m.provider?.trim())
88
+ errs.push(`roles.models.${role}.provider`);
89
+ if (!m.model?.trim())
90
+ errs.push(`roles.models.${role}.model`);
91
+ }
92
+ return errs;
93
+ }
94
+ export function diffOverride(baseline, snapshot) {
95
+ const out = {};
96
+ const w = {};
97
+ if (snapshot.wikiVault.baseUrl !== baseline.wikiVault.baseUrl)
98
+ w.baseUrl = snapshot.wikiVault.baseUrl;
99
+ if (snapshot.wikiVault.pagePrefix !== baseline.wikiVault.pagePrefix)
100
+ w.pagePrefix = snapshot.wikiVault.pagePrefix;
101
+ if (Object.keys(w).length)
102
+ out.wikiVault = w;
103
+ const models = {};
104
+ for (const role of ROLES) {
105
+ const snap = snapshot.roles.models[role];
106
+ const base = baseline.roles.models?.[role];
107
+ const cur = {};
108
+ if (snap && snap.provider !== base?.provider)
109
+ cur.provider = snap.provider;
110
+ if (snap && snap.model !== base?.model)
111
+ cur.model = snap.model;
112
+ // 空/空白 reasoningEffort 视为"跟随默认":不写入 override,effective 保持 baseline/默认。
113
+ const snapEffort = snap?.reasoningEffort?.trim() ? snap.reasoningEffort : undefined;
114
+ if (snapEffort !== undefined && snapEffort !== (base?.reasoningEffort ?? 'high'))
115
+ cur.reasoningEffort = snapEffort;
116
+ if (Object.keys(cur).length)
117
+ models[role] = cur;
118
+ }
119
+ if (Object.keys(models).length)
120
+ out.roles = { models: models };
121
+ const bre = baseline.reviewEngine ?? { mode: 'delegate', managed: { provider: '', model: '' } };
122
+ const snapMode = snapshot.reviewEngine?.mode ?? 'delegate';
123
+ const snapProvider = snapshot.reviewEngine?.managed?.provider ?? '';
124
+ const snapModel = snapshot.reviewEngine?.managed?.model ?? '';
125
+ const re = {};
126
+ if (snapMode !== bre.mode)
127
+ re.mode = snapMode;
128
+ const reManaged = {};
129
+ if (snapProvider !== bre.managed.provider)
130
+ reManaged.provider = snapProvider;
131
+ if (snapModel !== bre.managed.model)
132
+ reManaged.model = snapModel;
133
+ if (Object.keys(reManaged).length)
134
+ re.managed = reManaged;
135
+ if (Object.keys(re).length)
136
+ out.reviewEngine = re;
137
+ return out;
138
+ }
@@ -4,7 +4,7 @@ export declare function requiredDeliveryKeys(assignee: Role, mode: TaskMode): st
4
4
  export declare function missingPtDecisionKeys(handoff: Handoff | undefined): string[];
5
5
  /** 缺失的交付键(存在但为空的字符串/非字符串均视为缺失;pt_decision 走结构校验透传细粒度键)。
6
6
  * 可选 kbUrlBase:提供时对 w:kb 的 kb_url 做 host 前缀硬校验(防 LLM 手写错域名)、对 page_path 做
7
- * 命名空间格式校验(Q3&5:防 LLM 自造路径/拼错层级)——未提供则仅非空校验(兼容旧调用/测试)。 */
7
+ * 命名空间格式校验(防 LLM 自造路径/拼错层级)——未提供则仅非空校验(兼容旧调用/测试)。 */
8
8
  export declare function missingDeliveryKeys(assignee: Role, mode: TaskMode, handoff: Handoff | undefined, kbUrlBase?: string): string[];
9
9
  export declare function hasRequiredDelivery(assignee: Role, mode: TaskMode, handoff: Handoff | undefined): boolean;
10
10
  /** 交付契约缺失的父卡项(供 V 建下游卡前的前置校验)。 */
@@ -14,5 +14,6 @@ export interface MissingParentDelivery {
14
14
  mode: TaskMode;
15
15
  missing: string[];
16
16
  }
17
- /** 对一组父任务 id 做交付契约校验,返回缺关键交付物的父卡清单(无缺失返回空数组)。 */
18
- export declare function missingParentDelivery(state: BoardState, parentIds: string[]): MissingParentDelivery[];
17
+ /** 对一组父任务 id 做交付契约校验,返回缺关键交付物的父卡清单(无缺失返回空数组)。
18
+ * kbUrlBase 可选透传 missingDeliveryKeys(与上方 kbUrlBase 推导修正配套——local 模式传 '' 走 strict local 分支)。 */
19
+ export declare function missingParentDelivery(state: BoardState, parentIds: string[], kbUrlBase?: string): MissingParentDelivery[];
@@ -1,6 +1,6 @@
1
- import { isAllowedWikiPagePath } from '../wiki/page-path.js';
1
+ import { isAllowedWikiPagePath, isLocalKbPagePath, KB_PAGE_NAMESPACES_HINT } from '../wiki/page-path.js';
2
2
  /**
3
- * 上游交付契约(R20「上游对下游负责」宗旨):每阶段任务完成交接 metadata 必须产出的键。
3
+ * 上游交付契约(「上游对下游负责」宗旨):每阶段任务完成交接 metadata 必须产出的键。
4
4
  * key = `${assignee}:${mode}`;仅列出「下游实际读取」的硬交付物——
5
5
  * - w:kb(W2/W3):kb_url + page_path = KB 同步页(下游 wiki_read 读原文 / 收尾)
6
6
  * - p:openspec(P):artifacts_path = openspec 实施计划产物路径(W2 读取同步 KB);
@@ -32,7 +32,7 @@ export function missingPtDecisionKeys(handoff) {
32
32
  }
33
33
  /** 缺失的交付键(存在但为空的字符串/非字符串均视为缺失;pt_decision 走结构校验透传细粒度键)。
34
34
  * 可选 kbUrlBase:提供时对 w:kb 的 kb_url 做 host 前缀硬校验(防 LLM 手写错域名)、对 page_path 做
35
- * 命名空间格式校验(Q3&5:防 LLM 自造路径/拼错层级)——未提供则仅非空校验(兼容旧调用/测试)。 */
35
+ * 命名空间格式校验(防 LLM 自造路径/拼错层级)——未提供则仅非空校验(兼容旧调用/测试)。 */
36
36
  export function missingDeliveryKeys(assignee, mode, handoff, kbUrlBase) {
37
37
  const keys = requiredDeliveryKeys(assignee, mode);
38
38
  if (keys.length === 0)
@@ -40,24 +40,35 @@ export function missingDeliveryKeys(assignee, mode, handoff, kbUrlBase) {
40
40
  if (!handoff)
41
41
  return keys.slice();
42
42
  const m = handoff.metadata ?? {};
43
- const base = kbUrlBase ? kbUrlBase.replace(/\/$/, '') : null;
43
+ // 推导修正:kbUrlBase === undefined 才是宽松;'' 是 local strict
44
+ const hasBase = kbUrlBase !== undefined;
45
+ const base = hasBase ? kbUrlBase.replace(/\/$/, '') : null;
44
46
  const strict = base !== null;
45
47
  const missing = [];
46
48
  for (const k of keys) {
47
49
  if (k === 'pt_decision') {
48
50
  missing.push(...missingPtDecisionKeys(handoff));
51
+ continue;
52
+ }
53
+ const v = m[k];
54
+ if (strict && k === 'kb_url' && base === '') {
55
+ // local 模式:kb_url 必须显式空串(非缺失键)
56
+ if (typeof v !== 'string' || v.trim() !== '')
57
+ missing.push(`${k} (本地模式 kb_url 必须为空串)`);
58
+ continue;
59
+ }
60
+ if (typeof v !== 'string' || v.trim().length === 0) {
61
+ missing.push(k);
62
+ }
63
+ else if (strict && k === 'kb_url' && !v.startsWith(base)) {
64
+ missing.push(`${k} (host 前缀必须为 ${base})`);
65
+ }
66
+ else if (strict && k === 'page_path' && base === '') {
67
+ if (!isLocalKbPagePath(v))
68
+ missing.push(`${k} (本地模式必须为本地库 wiki/** 相对路径)`);
49
69
  }
50
- else {
51
- const v = m[k];
52
- if (typeof v !== 'string' || v.trim().length === 0) {
53
- missing.push(k);
54
- }
55
- else if (strict && k === 'kb_url' && !v.startsWith(base)) {
56
- missing.push(`${k} (host 前缀必须为 ${base})`);
57
- }
58
- else if (strict && k === 'page_path' && !isAllowedWikiPagePath(v)) {
59
- missing.push(`${k} (必须为 projects/checklists/、projects/learnings/、projects/<slug>/learnings/、projects/ch_*/learnings/、projects/ch_*/t_*.md 或 projects/ch_*/review/ 命名空间)`);
60
- }
70
+ else if (strict && k === 'page_path' && !isAllowedWikiPagePath(v)) {
71
+ missing.push(`${k} (必须为 ${KB_PAGE_NAMESPACES_HINT} 命名空间)`);
61
72
  }
62
73
  }
63
74
  return missing;
@@ -65,14 +76,15 @@ export function missingDeliveryKeys(assignee, mode, handoff, kbUrlBase) {
65
76
  export function hasRequiredDelivery(assignee, mode, handoff) {
66
77
  return missingDeliveryKeys(assignee, mode, handoff).length === 0;
67
78
  }
68
- /** 对一组父任务 id 做交付契约校验,返回缺关键交付物的父卡清单(无缺失返回空数组)。 */
69
- export function missingParentDelivery(state, parentIds) {
79
+ /** 对一组父任务 id 做交付契约校验,返回缺关键交付物的父卡清单(无缺失返回空数组)。
80
+ * kbUrlBase 可选透传 missingDeliveryKeys(与上方 kbUrlBase 推导修正配套——local 模式传 '' 走 strict local 分支)。 */
81
+ export function missingParentDelivery(state, parentIds, kbUrlBase) {
70
82
  const out = [];
71
83
  for (const pid of parentIds) {
72
84
  const pt = state.tasks.get(pid);
73
85
  if (!pt)
74
86
  continue;
75
- const missing = missingDeliveryKeys(pt.assignee, pt.mode, state.handoffs.get(pid));
87
+ const missing = missingDeliveryKeys(pt.assignee, pt.mode, state.handoffs.get(pid), kbUrlBase);
76
88
  if (missing.length > 0)
77
89
  out.push({ taskId: pid, assignee: pt.assignee, mode: pt.mode, missing });
78
90
  }
@@ -1,6 +1,6 @@
1
1
  import type { Handoff } from './types.js';
2
2
  /**
3
- * R20 D(execute) 交付物证据判定(C1/C2 共用):
3
+ * D(execute) 交付物证据判定:
4
4
  * 完成交接 metadata 必须带 changed_files(非空)+ (commit_hash | push) 至少其一,
5
5
  * 才算具备"实际执行并产出 git 产物"的证据。无证据 → 不判链完成 / kanban_complete 拒绝。
6
6
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * R20 D(execute) 交付物证据判定(C1/C2 共用):
2
+ * D(execute) 交付物证据判定:
3
3
  * 完成交接 metadata 必须带 changed_files(非空)+ (commit_hash | push) 至少其一,
4
4
  * 才算具备"实际执行并产出 git 产物"的证据。无证据 → 不判链完成 / kanban_complete 拒绝。
5
5
  *
@@ -18,7 +18,7 @@ export class FileEventStore {
18
18
  }
19
19
  }
20
20
  async append(ev) {
21
- // P1-8:seq 每次从文件尾行重读分配(跨进程安全,多 dsh 实例并发追加时 seq 唯一);
21
+ // seq 每次从文件尾行重读分配(跨进程安全,多 dsh 实例并发追加时 seq 唯一);
22
22
  // appendFileSync 单行 JSONL 追加在 POSIX 上原子(行 < 4KB,无锁无残留)。
23
23
  const all = this.readAllSync();
24
24
  const seq = all.length > 0 ? all[all.length - 1].seq + 1 : 0;
@@ -0,0 +1,26 @@
1
+ export interface GateCommand {
2
+ command: string;
3
+ cwd: string;
4
+ source: 'tdd';
5
+ }
6
+ export interface GatePlan {
7
+ commands: GateCommand[];
8
+ skipped: false;
9
+ }
10
+ export interface GateSkip {
11
+ commands: [];
12
+ skipped: true;
13
+ reason: string;
14
+ }
15
+ export declare function isGatePlan(x: GatePlan | GateSkip): x is GatePlan;
16
+ export declare function branchMatches(current: string | null, declared: unknown): boolean;
17
+ export declare function deriveGatePlan(input: {
18
+ assignee: string;
19
+ mode: string;
20
+ handoff: {
21
+ metadata?: Record<string, unknown>;
22
+ };
23
+ config: {
24
+ enabled: boolean;
25
+ };
26
+ }): GatePlan | GateSkip;
@@ -0,0 +1,44 @@
1
+ // src/domain/gate-policy.ts
2
+ /** kanban_complete 实测闸派生(纯函数,零 IO):
3
+ * 声明来源单层——tdd.test_files 自动派生 npx --no-install vitest run(runner=vitest 为 review-evidence 既有口径)。
4
+ * cwd 一律 metadata.worktree_dir,缺失即 skip(旧卡向后兼容零感知)。
5
+ * test_files 必须相对路径且规范化后无 .. 段(防绝对路径跑主仓库/越界逃逸——跑错代码即闸被绕过),违规整单 skip。
6
+ * branchMatches 供装配层在 git 查询后做分支一致性比对(current=null 视为不匹配,调用方 skip)。 */
7
+ import { isAbsolute } from 'node:path';
8
+ export function isGatePlan(x) {
9
+ return x.skipped === false;
10
+ }
11
+ export function branchMatches(current, declared) {
12
+ return typeof declared === 'string' && declared.trim().length > 0 && current === declared;
13
+ }
14
+ /** 相对路径 + 不得含 .. 段(含 a/../b 形式,一并拒绝,从简从严)。
15
+ * 另限字符 allowlist [A-Za-z0-9._/-]:test_files 会被拼入 `bash -c` 执行(见 gate-runner),
16
+ * 白名单一并拒绝空白与 ; | & $ ` () 等元字符——既防 shell 注入(如 'x || true' 拼成
17
+ * `vitest run x || true`,未跑闸却 exit 0 通过),也防借空白等变体绕 runner 黑名单子串匹配
18
+ * (如 'a;git push' 双空格躲过 includes('git push'))。 */
19
+ const isSafeRelativeTestFile = (f) => /^[A-Za-z0-9._/-]+$/.test(f) && !isAbsolute(f) && !f.split(/[/\\]/).includes('..')
20
+ && !f.startsWith('-'); // 拒绝以 - 开头的条目:防 vitest CLI 旗标注入(如 --passWithNoTests 使 0 tests matched 也 exit 0,空跑绕闸)
21
+ export function deriveGatePlan(input) {
22
+ const m = input.handoff.metadata ?? {};
23
+ if (!input.config.enabled)
24
+ return { commands: [], skipped: true, reason: 'gates disabled' };
25
+ if (!(input.assignee === 'd' && input.mode === 'execute'))
26
+ return { commands: [], skipped: true, reason: 'not d/execute' };
27
+ const wt = m['worktree_dir'];
28
+ if (typeof wt !== 'string' || !wt.trim())
29
+ return { commands: [], skipped: true, reason: 'worktree_dir missing (legacy card)' };
30
+ const tdd = m['tdd'];
31
+ if (tdd?.skipped)
32
+ return { commands: [], skipped: true, reason: 'tdd skipped by declaration' };
33
+ if (!Array.isArray(tdd?.test_files) || tdd.test_files.length === 0)
34
+ return { commands: [], skipped: true, reason: 'no gate commands' };
35
+ const files = tdd.test_files.filter((f) => typeof f === 'string' && f.trim().length > 0);
36
+ if (files.length === 0)
37
+ return { commands: [], skipped: true, reason: 'no gate commands' };
38
+ if (!files.every(isSafeRelativeTestFile))
39
+ return { commands: [], skipped: true, reason: 'invalid test_files path (relative in-worktree required)' };
40
+ return {
41
+ commands: [{ command: `npx --no-install vitest run ${files.join(' ')}`, cwd: wt, source: 'tdd' }],
42
+ skipped: false,
43
+ };
44
+ }
@@ -0,0 +1,15 @@
1
+ import type { BoardState, KanbanEvent, Task } from './types.js';
2
+ /** W3 收尾判据(镜像 kanban-service.completeTask 机械规则,但不含 dEvidenceOk 与链状态要求):
3
+ * 完成卡为 w+kb、链上无未终态卡、它是最后完成的卡、且链上存在 done 的 D 卡(防 W2 中间态误投)。 */
4
+ export declare function isFinalW3Completion(state: BoardState, chainId: string, completedTaskId: string): boolean;
5
+ /** 成功汇报(markdown)。判据不满足(W2 中间态/非 w:kb/非收尾)返回 null。 */
6
+ export declare function buildCompletionMessage(state: BoardState, chainId: string, completedTaskId: string, now: number): string | null;
7
+ export declare function suggestionsFor(reason: string): string[];
8
+ /** 链下全部 blocked 卡(title + 最近一次 task/blocked 原因)。 */
9
+ export declare function latestBlockedTasks(events: KanbanEvent[], tasks: Iterable<Task>, chainId: string): Array<{
10
+ id: string;
11
+ title: string;
12
+ reason: string;
13
+ }>;
14
+ /** 阻塞通知(markdown)。 */
15
+ export declare function buildBlockMessage(state: BoardState, chainId: string, chainReason: string, storageDir: string): string;
@@ -0,0 +1,149 @@
1
+ import { hasDeliveryEvidence } from './delivery-evidence.js';
2
+ /** W3 收尾判据(镜像 kanban-service.completeTask 机械规则,但不含 dEvidenceOk 与链状态要求):
3
+ * 完成卡为 w+kb、链上无未终态卡、它是最后完成的卡、且链上存在 done 的 D 卡(防 W2 中间态误投)。 */
4
+ export function isFinalW3Completion(state, chainId, completedTaskId) {
5
+ const task = state.tasks.get(completedTaskId);
6
+ if (!task || task.chainId !== chainId || task.assignee !== 'w' || task.mode !== 'kb')
7
+ return false;
8
+ const chainTasks = [...state.tasks.values()].filter((t) => t.chainId === chainId);
9
+ if (chainTasks.some((t) => t.status !== 'done' && t.status !== 'archived'))
10
+ return false;
11
+ const completedEvents = state.events.filter((e) => e.chainId === chainId && e.kind === 'task/completed' && e.taskId);
12
+ if (completedEvents.at(-1)?.taskId !== completedTaskId)
13
+ return false;
14
+ return chainTasks.some((t) => (t.mode === 'execute' || t.mode === 'align') && t.status === 'done');
15
+ }
16
+ function fmtTime(ms) {
17
+ const d = new Date(ms);
18
+ const p = (n) => String(n).padStart(2, '0');
19
+ return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
20
+ }
21
+ function strMeta(handoff, key) {
22
+ const v = (handoff?.metadata ?? {})[key];
23
+ return typeof v === 'string' ? v.trim() : '';
24
+ }
25
+ /** 人工关注点:TDD 跳过声明、D 证据缺失(链完成门禁拦截)、审计警告状态。 */
26
+ function completionAttention(state, chainId, dHandoff) {
27
+ const out = [];
28
+ const tdd = (dHandoff?.metadata ?? {})['tdd'];
29
+ const skipReason = tdd?.skipped && typeof tdd.skipped['reason'] === 'string' ? tdd.skipped['reason'].trim() : '';
30
+ if (skipReason)
31
+ out.push(`TDD 曾跳过:${skipReason}`);
32
+ if (!hasDeliveryEvidence(dHandoff))
33
+ out.push('D 卡缺 git 产物证据,链未自动收链,请人工核对');
34
+ const audit = state.auditWarnings.get(chainId);
35
+ if (audit && !audit.confirmedAt)
36
+ out.push(`审计警告待 GUI 确认(${audit.evidence.length} 条证据)`);
37
+ else if (audit?.confirmedAt)
38
+ out.push(`审计警告已于 ${fmtTime(audit.confirmedAt)} 确认`);
39
+ return out;
40
+ }
41
+ /** 成功汇报(markdown)。判据不满足(W2 中间态/非 w:kb/非收尾)返回 null。 */
42
+ export function buildCompletionMessage(state, chainId, completedTaskId, now) {
43
+ if (!isFinalW3Completion(state, chainId, completedTaskId))
44
+ return null;
45
+ const chain = state.chains.get(chainId);
46
+ if (!chain)
47
+ return null;
48
+ const chainTasks = [...state.tasks.values()].filter((t) => t.chainId === chainId);
49
+ const wHandoff = state.handoffs.get(completedTaskId);
50
+ const dTask = chainTasks.find((t) => (t.mode === 'execute' || t.mode === 'align') && t.status === 'done');
51
+ const dHandoff = state.handoffs.get(dTask.id);
52
+ const pTask = [...chainTasks].reverse().find((t) => t.assignee === 'p' && t.status === 'done');
53
+ const artifacts = strMeta(pTask ? state.handoffs.get(pTask.id) : undefined, 'artifacts_path');
54
+ const lines = [];
55
+ lines.push(`**【DSH 需求完成】${chain.title}**`);
56
+ lines.push('');
57
+ lines.push(`**完成清单**(${fmtTime(now)})`);
58
+ for (const t of chainTasks)
59
+ lines.push(`- ✅ ${t.title}`);
60
+ lines.push('');
61
+ lines.push('**产出**');
62
+ const kbUrl = strMeta(wHandoff, 'kb_url');
63
+ const pagePath = strMeta(wHandoff, 'page_path');
64
+ if (kbUrl)
65
+ lines.push(`- KB 文档:${kbUrl}`);
66
+ if (pagePath)
67
+ lines.push(`- KB 页:${pagePath}`);
68
+ lines.push(`- 产出物:${artifacts || '(无)'}`);
69
+ const attention = completionAttention(state, chainId, dHandoff);
70
+ if (attention.length > 0) {
71
+ lines.push('');
72
+ lines.push('**人工关注点**');
73
+ for (const a of attention)
74
+ lines.push(`- ${a}`);
75
+ }
76
+ return lines.join('\n');
77
+ }
78
+ /** 阻塞建议映射表(静态工程知识,禁止模型现场生成——评审决议)。 */
79
+ const SUGGESTION_TABLE = [
80
+ {
81
+ pattern: /\[create-failed\]/,
82
+ lines: [
83
+ 'V 连续多轮建卡失败:查 dispatcher.log 的 [wakeV] / [tick] error 行,确认编排会话报错原因',
84
+ '核对 roles.models.v 模型路由配置;历史案例:网关回复缓存回放(from-cache)会致零工具调用,可更换 provider/model 后重试',
85
+ ],
86
+ },
87
+ {
88
+ pattern: /\[stall-watchdog\]/,
89
+ lines: [
90
+ '链持续无进展且重唤醒耗尽:查 dispatcher.log [stall-watchdog] 行与 orchestration.json 的 phase/stallCount',
91
+ '检查最后一张卡会话(kbn-<taskId>)session.jsonl 是否空壳(仅 4 行骨架)——空壳需人工清理后删链重跑',
92
+ ],
93
+ },
94
+ ];
95
+ export function suggestionsFor(reason) {
96
+ const out = [];
97
+ for (const row of SUGGESTION_TABLE) {
98
+ if (row.pattern.test(reason))
99
+ out.push(...row.lines);
100
+ }
101
+ if (out.length === 0) {
102
+ out.push('查 events.jsonl 最近事件定位阻塞前最后一个动作');
103
+ out.push('GUI 打开该链逐卡核对状态;人工恢复 = 删链重跑');
104
+ }
105
+ return out;
106
+ }
107
+ /** 链下全部 blocked 卡(title + 最近一次 task/blocked 原因)。 */
108
+ export function latestBlockedTasks(events, tasks, chainId) {
109
+ const reasons = new Map();
110
+ for (const e of events) {
111
+ if (e.chainId !== chainId || e.kind !== 'task/blocked' || !e.taskId)
112
+ continue;
113
+ reasons.set(e.taskId, String(e.payload['reason'] ?? ''));
114
+ }
115
+ const out = [];
116
+ for (const t of tasks) {
117
+ if (t.chainId !== chainId || t.status !== 'blocked')
118
+ continue;
119
+ out.push({ id: t.id, title: t.title, reason: reasons.get(t.id) ?? '(原因见事件流)' });
120
+ }
121
+ return out;
122
+ }
123
+ /** 阻塞通知(markdown)。 */
124
+ export function buildBlockMessage(state, chainId, chainReason, storageDir) {
125
+ const chain = state.chains.get(chainId);
126
+ const blocked = latestBlockedTasks(state.events, state.tasks.values(), chainId);
127
+ const lines = [];
128
+ lines.push(`**【DSH 需求阻塞】${chain?.title ?? chainId}**`);
129
+ lines.push('');
130
+ lines.push('**阻塞卡**');
131
+ if (blocked.length === 0)
132
+ lines.push('- 无(链级停滞,见阻塞原因)');
133
+ else
134
+ for (const b of blocked)
135
+ lines.push(`- ${b.title}:${b.reason}`);
136
+ lines.push('');
137
+ lines.push('**阻塞原因**');
138
+ lines.push(`> ${chainReason}`);
139
+ lines.push('');
140
+ lines.push('**排查建议**');
141
+ for (const s of suggestionsFor(chainReason))
142
+ lines.push(`- ${s}`);
143
+ lines.push('');
144
+ lines.push('**取证路径**');
145
+ lines.push(`- 事件:${storageDir}/events.jsonl`);
146
+ lines.push(`- 编排:${storageDir}/orchestration.json`);
147
+ lines.push(`- 调度:${storageDir}/dispatcher.log`);
148
+ return lines.join('\n');
149
+ }
@@ -2,7 +2,7 @@ import type { EventStore } from './event-store.js';
2
2
  import { type Actor } from './permissions.js';
3
3
  import type { AuditEvidence, BoardState, Chain, Handoff, KanbanEvent, SpecCard, SpecCardAttachment, SpecCardSections, Task, TaskMode, Role, ReviewEvidence } from './types.js';
4
4
  export type KanbanListener = (event: KanbanEvent) => void;
5
- /** 首句:trim 后按首个换行或「。?! 」截断;超长兜底 40 字(T7 需求标题规范化)。 */
5
+ /** 首句:trim 后按首个换行或「。?! 」截断;超长兜底 40 字(需求标题规范化)。 */
6
6
  export declare function firstSentence(text: string): string;
7
7
  /** 默认链标题:【需求】<一句话需求描述>。来源优先级 /plan: rest 首句 → checklist.problem 首句 → 未命名需求。 */
8
8
  export declare function buildChainTitle(requirementName: string | null, _openspecRest: string, problem: string): string;
@@ -10,20 +10,26 @@ export declare function buildChainTitle(requirementName: string | null, _openspe
10
10
  export declare class KanbanService {
11
11
  private state;
12
12
  private readonly store;
13
- private readonly kbUrlBase;
13
+ private readonly getKbUrlBase;
14
14
  private emitQueue;
15
15
  private readonly listeners;
16
16
  private onChainCompletedHook;
17
17
  private onTaskCompletedHook;
18
- constructor(store: EventStore, kbUrlBase?: string);
18
+ private gateHook;
19
+ constructor(store: EventStore, getKbUrlBase?: () => string | undefined);
19
20
  private emit;
20
- /** D23:注入链完成核对钩子(由调度层设置;仅一个消费者)。 */
21
+ /** 注入链完成核对钩子(由调度层设置;仅一个消费者)。 */
21
22
  setOnChainCompleted(hook: (chainId: string) => void | Promise<void>): void;
22
- /** Q3&5:注入任务完成互链登记钩子(由调度层设置;仅一个消费者)。 */
23
+ /** 注入任务完成互链登记钩子(由调度层设置;仅一个消费者)。 */
23
24
  setOnTaskCompleted(hook: (taskId: string) => void | Promise<void>): void;
24
- /** T22:订阅持久化后的看板事件;返回解除订阅函数。listener 异常不影响已落盘状态。 */
25
+ /** 注入实测闸钩子(由装配层设置;null=关闭实测闸,行为与旧版逐字节一致)。 */
26
+ setGateHook(hook: ((task: Task, handoff: Handoff) => Promise<{
27
+ ok: boolean;
28
+ detail: string;
29
+ } | null>) | null): void;
30
+ /** 订阅持久化后的看板事件;返回解除订阅函数。listener 异常不影响已落盘状态。 */
25
31
  subscribe(listener: KanbanListener): () => void;
26
- /** T22:返回 seq >= 入参 的事件(与 EventStore.readSince 同为 inclusive 语义)。 */
32
+ /** 返回 seq >= 入参 的事件(与 EventStore.readSince 同为 inclusive 语义)。 */
27
33
  eventsSince(seq: number): Promise<KanbanEvent[]>;
28
34
  private publish;
29
35
  private chainOf;
@@ -36,6 +42,12 @@ export declare class KanbanService {
36
42
  createSpecCard(chainId: string, sections: SpecCardSections, actor: Actor): Promise<SpecCard>;
37
43
  editSpecCard(cardId: string, sections: SpecCardSections, actor: Actor): Promise<SpecCard>;
38
44
  approveSpecCard(cardId: string, actor: Actor): Promise<SpecCard>;
45
+ /** 链级停滞终态(防线A,看门狗/V stall 超限专用机械记账):executing → blocked。
46
+ * 非 executing 调用即抛(fail-closed);人工恢复=GUI 删链重跑(blocked 无出边)。 */
47
+ blockChain(chainId: string, reason: string): Promise<void>;
48
+ /** IM 投递失败留痕(仅 system 机械记账):非状态转换注记事件,仅落盘供取证/GUI 观察。
49
+ * 投递是旁路通知,失败绝不 block 链(评审决议);留痕满足「禁止静默 skip」红线。 */
50
+ noteImDeliveryFailed(chainId: string, detail: string, actor: Actor): Promise<KanbanEvent>;
39
51
  createTask(input: {
40
52
  chainId: string;
41
53
  title: string;
@@ -49,11 +61,11 @@ export declare class KanbanService {
49
61
  completeTask(taskId: string, handoff: Handoff, actor: Actor, opts?: {
50
62
  boundTaskId?: string;
51
63
  }): Promise<Task>;
52
- /** D23:链完成验收核对发警告(仅 system/dispatcher 可发)。Chain 状态保持 completed。 */
64
+ /** 链完成验收核对发警告(仅 system/dispatcher 可发)。Chain 状态保持 completed。 */
53
65
  auditWarning(chainId: string, evidence: AuditEvidence[], actor: Actor): Promise<KanbanEvent>;
54
- /** D23:用户确认产物归属(仅 human,GUI confirm-audit action)。放行最终汇报。 */
66
+ /** 用户确认产物归属(仅 human,GUI confirm-audit action)。放行最终汇报。 */
55
67
  confirmAudit(chainId: string, actor: Actor): Promise<KanbanEvent>;
56
- /** T7:链标题改名(仅 human,GUI)。发 chain/title-updated 事件(非状态转换)。 */
68
+ /** 链标题改名(仅 human,GUI)。发 chain/title-updated 事件(非状态转换)。 */
57
69
  updateChainTitle(chainId: string, title: string, actor: Actor): Promise<Chain>;
58
70
  /** 整链硬删除(含其下全部角色卡/规格卡事件;仅 human,GUI 二次确认)。物理 purge 事件行,不可恢复。 */
59
71
  deleteChain(chainId: string, actor: Actor): Promise<void>;
@@ -71,7 +83,7 @@ export declare class KanbanService {
71
83
  }): Promise<Task>;
72
84
  comment(taskId: string, body: string, actor: Actor): Promise<KanbanEvent>;
73
85
  archiveTask(taskId: string, actor: Actor): Promise<Task>;
74
- /** T10.5:仅 draft 规格卡可挂附件(V 挂清单附件(/openspec: 建链)/ human GUI 上传)。 */
86
+ /** 仅 draft 规格卡可挂附件(V 挂清单附件(/openspec: 建链)/ human GUI 上传)。 */
75
87
  addSpecCardAttachment(cardId: string, attachment: SpecCardAttachment, actor: Actor): Promise<SpecCard>;
76
88
  /** 评审事件(交付质量链):recordReview 记录评审卡结论并更新被评审任务 reviewStatus。
77
89
  * actor 必须 system(V/角色不可伪造评审结论);verdict=pass → review/passed,否则 review/failed。
@@ -80,7 +92,11 @@ export declare class KanbanService {
80
92
  /** 评审超限放弃:review/gave-up(含证据链信息)。仅 system。 */
81
93
  reviewGaveUp(reviewTaskId: string, targetTaskId: string, reason: string, actor: Actor): Promise<KanbanEvent>;
82
94
  /** 评审失败返工卡创建(评审失败闭环):原任务保持 done(不可变),新建返工卡继承 rework 字段。
83
- * 仅 system(can('create-rework-task')=system);V 建执行卡、system 建返工卡。 */
95
+ * 仅 system(can('create-rework-task')=system);V 建执行卡、system 建返工卡。
96
+ * 语义(2026-09-07 修正):返工=该卡自己的独立会话——resumeSessionId 不继承源卡会话(置 null),
97
+ * 首跑由 runTask create `kbn-<reworkId>`,卡自身失败重试再 resume 该会话;reworkOfTaskId 保留溯源。
98
+ * 旧实现继承 source.sessionId 造成三方错位:runTask 首跑不消费它(hasRunHistory=false→create 新会话)、
99
+ * UI(BoardCard resumeSessionId??sessionId)却跳到源卡会话 → 「返工在后台跑但哪都找不到它」。 */
84
100
  createReworkTask(input: {
85
101
  sourceTaskId: string;
86
102
  reviewTaskId: string;