@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.
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/client/BoardCard.tsx +24 -2
- package/client/ConfigSection.tsx +71 -0
- package/client/ConfigSelect.tsx +69 -0
- package/client/KanbanBoard.tsx +3 -0
- package/client/KanbanTab.tsx +4 -3
- package/client/TaskDrawer.tsx +31 -31
- package/client/WorkflowRail.tsx +3 -1
- package/client/config-store.ts +51 -0
- package/client/config.css +110 -0
- package/client/index.ts +39 -4
- package/client/kanban.css +134 -2
- package/client/session-bridge.ts +39 -0
- package/client/timeline-model.ts +210 -0
- package/client/workflow-model.ts +3 -1
- package/lib/client.js +549 -64
- package/lib/config.d.ts +19 -4
- package/lib/config.js +18 -3
- package/lib/dispatcher/agent-runner.d.ts +28 -6
- package/lib/dispatcher/agent-runner.js +175 -62
- package/lib/dispatcher/chain-auditor.js +4 -1
- package/lib/dispatcher/dispatcher.d.ts +62 -3
- package/lib/dispatcher/dispatcher.js +243 -20
- package/lib/dispatcher/session-events.d.ts +11 -15
- package/lib/dispatcher/session-events.js +17 -5
- package/lib/dispatcher/v-orchestrator.d.ts +42 -9
- package/lib/dispatcher/v-orchestrator.js +236 -28
- package/lib/domain/config-override.d.ts +38 -0
- package/lib/domain/config-override.js +101 -0
- package/lib/domain/delivery-contract.d.ts +3 -2
- package/lib/domain/delivery-contract.js +28 -16
- package/lib/domain/gate-policy.d.ts +26 -0
- package/lib/domain/gate-policy.js +44 -0
- package/lib/domain/kanban-service.d.ts +16 -3
- package/lib/domain/kanban-service.js +41 -6
- package/lib/domain/memory.d.ts +29 -0
- package/lib/domain/memory.js +145 -0
- package/lib/domain/permissions.js +1 -1
- package/lib/domain/planning-checklist.d.ts +5 -0
- package/lib/domain/planning-checklist.js +80 -6
- package/lib/domain/projection.js +2 -1
- package/lib/domain/review-evidence.js +1 -1
- package/lib/domain/state-machine.js +2 -1
- package/lib/domain/types.d.ts +2 -2
- package/lib/index.js +19 -21
- package/lib/roles/clean-fs-tools.d.ts +22 -0
- package/lib/roles/clean-fs-tools.js +118 -0
- package/lib/roles/skill-installer.d.ts +6 -0
- package/lib/roles/skill-installer.js +32 -0
- package/lib/roles/toolsets.d.ts +13 -1
- package/lib/roles/toolsets.js +163 -31
- package/lib/roles/wiki-worker.d.ts +1 -0
- package/lib/roles/wiki-worker.js +10 -2
- package/lib/routes/kanban-http.d.ts +5 -2
- package/lib/routes/kanban-http.js +36 -3
- package/lib/routes/planning-driver.d.ts +7 -6
- package/lib/routes/planning-driver.js +19 -11
- package/lib/routes/prefix-router.d.ts +28 -13
- package/lib/routes/prefix-router.js +66 -1
- package/lib/services/config-provider.d.ts +42 -0
- package/lib/services/config-provider.js +94 -0
- package/lib/services/gate-runner.d.ts +24 -0
- package/lib/services/gate-runner.js +87 -0
- package/lib/services/kanban-provider.d.ts +5 -1
- package/lib/services/kanban-provider.js +40 -2
- package/lib/services/llm-catalog.d.ts +35 -0
- package/lib/services/llm-catalog.js +19 -0
- package/lib/tools/kanban-tools.js +1 -0
- package/lib/tools/main-session-tools.d.ts +17 -2
- package/lib/tools/main-session-tools.js +112 -25
- package/lib/tools/planning-tools.d.ts +9 -0
- package/lib/tools/planning-tools.js +120 -4
- package/lib/tools/prefetch-tools.js +1 -0
- package/lib/tools/spec-card-tools.js +1 -0
- package/lib/tools/wiki-tools.js +5 -4
- package/lib/wiki/kb-linkage.d.ts +9 -2
- package/lib/wiki/kb-linkage.js +3 -3
- package/lib/wiki/local-kb-client.d.ts +14 -0
- package/lib/wiki/local-kb-client.js +101 -0
- package/lib/wiki/local-kb.d.ts +6 -0
- package/lib/wiki/local-kb.js +25 -0
- package/lib/wiki/memory-recall.d.ts +24 -0
- package/lib/wiki/memory-recall.js +62 -0
- package/lib/wiki/page-path.d.ts +10 -1
- package/lib/wiki/page-path.js +31 -8
- package/lib/wiki/wiki-vault-client.d.ts +4 -3
- package/lib/wiki/wiki-vault-client.js +6 -6
- package/package.json +16 -11
- package/personas/kanban-d/preset.yml +1 -1
- package/personas/kanban-dt/agent.cordis.yml +3 -3
- package/personas/kanban-dt/preset.yml +1 -1
- package/personas/kanban-p/agent.cordis.yml +16 -0
- package/personas/kanban-p/preset.yml +1 -1
- package/personas/kanban-pt/agent.cordis.yml +38 -8
- package/personas/kanban-pt/preset.yml +1 -1
- package/personas/kanban-w/agent.cordis.yml +35 -16
- package/personas/kanban-w/preset.yml +1 -1
- package/personas/persona-dt.md +1 -1
- package/personas/persona-p.md +4 -1
- package/personas/persona-pt.md +13 -6
- package/personas/persona-w.md +11 -9
- package/skills/grill-me/SKILL.md +71 -0
- package/skills/llm-wiki-skill/.mise.toml +2 -0
- package/skills/llm-wiki-skill/.nvmrc +1 -0
- package/skills/llm-wiki-skill/AGENTS.md +173 -0
- package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
- package/skills/llm-wiki-skill/CLAUDE.md +152 -0
- package/skills/llm-wiki-skill/HERMES.md +44 -0
- package/skills/llm-wiki-skill/README.en.md +261 -0
- package/skills/llm-wiki-skill/README.md +291 -0
- package/skills/llm-wiki-skill/SKILL.md +1133 -0
- package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
- package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
- package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
- package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
- package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
- package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
- package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
- package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
- package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
- package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
- package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
- package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
- package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
- package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
- package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
- package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
- package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
- package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
- package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
- package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
- package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
- package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
- package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
- package/skills/llm-wiki-skill/install.ps1 +87 -0
- package/skills/llm-wiki-skill/install.sh +722 -0
- package/skills/llm-wiki-skill/package-lock.json +11171 -0
- package/skills/llm-wiki-skill/package.json +24 -0
- package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
- package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
- package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
- package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
- package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
- package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
- package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
- package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
- package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
- package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
- package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
- package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
- package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
- package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
- package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
- package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
- package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
- package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
- package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
- package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
- package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
- package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
- package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
- package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
- package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
- package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
- package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
- package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
- package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
- package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
- package/skills/llm-wiki-skill/setup.sh +8 -0
- package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
- package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
- package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
- package/skills/llm-wiki-skill/templates/index-template.md +51 -0
- package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
- package/skills/llm-wiki-skill/templates/log-template.md +11 -0
- package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
- package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
- package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
- package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
- package/skills/llm-wiki-skill/templates/query-template.md +19 -0
- package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
- package/skills/llm-wiki-skill/templates/source-template.md +51 -0
- package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
- package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
- package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
- package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
- package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
- package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
- package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
- package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
- package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
- package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
- package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
- package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
- package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
- package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
- package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
- package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
- package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
- package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
- package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
- package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
- package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
- package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
- package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
- package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
- package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
- package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
- package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
- package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
- package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
- package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
- package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
- package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
- package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
- package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
- package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
- package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
- package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
- package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
- package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
- package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
- package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
- package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
- package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
- package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
- package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
- package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
- package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
- package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
- package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
- package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
- package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
- package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
- package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
- package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
- package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
- package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
- package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
- package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
- package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
- package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
- package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
- package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
- package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
- package/skills/llm-wiki-skill/workbench/README.md +30 -0
- package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
- package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
- package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
- package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
- package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
- package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
- package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
- package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
- package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
- package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
- package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
- package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
- package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
- package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
- package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
- package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
- package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
- package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
- package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
- package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
- package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
- package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
- package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
- package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
- package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
- package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
- package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
- package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
- package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
- package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
- package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
- package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
- package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
- package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
- package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
- package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
- package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
- package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
- package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
- package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
- package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
- package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
- package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
- package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
- package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
- package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
- package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
- package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
- package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
- package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
- package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
- package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
- package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
- package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
- package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
- package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
- package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
- package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
- package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
- package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
- package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
- package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
- package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
- package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
- package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
- package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
- package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
- package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
- package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
package/lib/tools/wiki-tools.js
CHANGED
|
@@ -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
|
|
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
|
|
47
|
-
//
|
|
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 手写错域名)。
|
package/lib/wiki/kb-linkage.d.ts
CHANGED
|
@@ -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:
|
|
15
|
+
export declare function syncKbLinks(wiki: KbWikiClient, state: BoardState, taskId: string): Promise<void>;
|
|
16
|
+
export {};
|
package/lib/wiki/kb-linkage.js
CHANGED
|
@@ -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'
|
|
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
|
+
}
|
package/lib/wiki/page-path.d.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
|
|
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;
|
package/lib/wiki/page-path.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// src/wiki/page-path.ts
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 (
|
|
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
|
|
13
|
-
constructor(
|
|
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
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
/** P2:暴露 baseUrl getter(下游 WikiWorker 拼 kb_url
|
|
15
|
-
get baseUrl() { return this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
59
|
-
"@deepseek-ai/dsh-
|
|
60
|
-
"@deepseek-ai/dsh-
|
|
61
|
-
"@deepseek-ai/dsh-
|
|
62
|
-
"@deepseek-ai/dsh-
|
|
63
|
-
"@deepseek-ai/dsh-tool-
|
|
64
|
-
"@deepseek-ai/dsh-tool-fs
|
|
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-
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-layout": "^0.1.
|
|
70
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
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:
|
|
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
|
|
35
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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:
|
|
1
|
+
name: 计划审查官(PT)
|
|
2
2
|
description: 只读评审 P 产出的实施计划,输出通过/打回结论,不修改任何产物、不执行代码。
|