@research-copilot/plugin 1.1.17 → 1.1.19
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 +18 -9
- package/dist/.claude-plugin/plugin.json +1 -1
- package/dist/.codex-plugin/plugin.toml +1 -1
- package/dist/.cursor-plugin/plugin.json +1 -1
- package/dist/.gemini-plugin/plugin.json +1 -1
- package/dist/.opencode-plugin/plugin.json +1 -1
- package/dist/.windsurf-plugin/plugin.json +1 -1
- package/dist/skills/ablation-planner/SKILL.md +126 -0
- package/dist/skills/alphaxiv/SKILL.md +186 -0
- package/dist/skills/analyze-results/SKILL.md +45 -0
- package/dist/skills/arxiv/SKILL.md +210 -0
- package/dist/skills/auto-paper-improvement-loop/SKILL.md +574 -0
- package/dist/skills/auto-review-loop/SKILL.md +370 -0
- package/dist/skills/auto-review-loop-llm/SKILL.md +247 -0
- package/dist/skills/auto-review-loop-minimax/SKILL.md +290 -0
- package/dist/skills/benchmark-paper-template/SKILL.md +142 -0
- package/dist/skills/benchmark-paper-template/references/benchmark-design.md +180 -0
- package/dist/skills/benchmark-paper-template/references/checklist.md +113 -0
- package/dist/skills/benchmark-paper-template/references/construction-pipeline.md +127 -0
- package/dist/skills/benchmark-paper-template/references/experiments.md +159 -0
- package/dist/skills/benchmark-paper-template/references/gap-analysis.md +86 -0
- package/dist/skills/benchmark-paper-template/references/instantiation-template.md +194 -0
- package/dist/skills/benchmark-paper-template/references/orchestrator-notes.md +96 -0
- package/dist/skills/benchmark-paper-template/references/paper-structure.md +209 -0
- package/dist/skills/citation-audit/SKILL.md +494 -0
- package/dist/skills/claims-drafting/SKILL.md +239 -0
- package/dist/skills/comm-lit-review/SKILL.md +299 -0
- package/dist/skills/comm-lit-review/references/domain-taxonomy.md +57 -0
- package/dist/skills/comm-lit-review/references/output-template.md +37 -0
- package/dist/skills/comm-lit-review/references/source-policy.md +99 -0
- package/dist/skills/comm-lit-review/references/venue-tiering.md +112 -0
- package/dist/skills/composer/SKILL.md +840 -0
- package/dist/skills/composer/references/section_guides.md +675 -0
- package/dist/skills/composer/references/writing_standards.md +629 -0
- package/dist/skills/composer/scripts/chapter_quality_check.py +470 -0
- package/dist/skills/composer/scripts/final_evaluation.py +550 -0
- package/dist/skills/deepxiv/SKILL.md +142 -0
- package/dist/skills/dse-loop/SKILL.md +277 -0
- package/dist/skills/embodiment-description/SKILL.md +129 -0
- package/dist/skills/exa-search/SKILL.md +192 -0
- package/dist/skills/experiment-audit/SKILL.md +262 -0
- package/dist/skills/experiment-bridge/SKILL.md +316 -0
- package/dist/skills/experiment-plan/SKILL.md +249 -0
- package/dist/skills/experiment-queue/SKILL.md +380 -0
- package/dist/skills/experiment-queue/scripts/build_manifest.py +142 -0
- package/dist/skills/experiment-queue/scripts/queue_manager.py +426 -0
- package/dist/skills/feishu-notify/SKILL.md +155 -0
- package/dist/skills/figure-description/SKILL.md +138 -0
- package/dist/skills/figure-designer/SKILL.md +207 -0
- package/dist/skills/figure-designer/references/design-rules.md +99 -0
- package/dist/skills/figure-designer/references/experimental-results.md +127 -0
- package/dist/skills/figure-designer/references/motivated-example.md +138 -0
- package/dist/skills/figure-designer/references/solution-overview.md +145 -0
- package/dist/skills/figure-designer/references/tools.md +124 -0
- package/dist/skills/figure-spec/SKILL.md +252 -0
- package/dist/skills/figure-spec/scripts/figure_renderer.py +799 -0
- package/dist/skills/formula-derivation/SKILL.md +280 -0
- package/dist/skills/gemini-search/SKILL.md +205 -0
- package/dist/skills/grant-proposal/SKILL.md +625 -0
- package/dist/skills/humanizer/AGENTS.md +25 -0
- package/dist/skills/humanizer/SKILL.md +621 -0
- package/dist/skills/idea-creator/SKILL.md +311 -0
- package/dist/skills/idea-discovery/SKILL.md +340 -0
- package/dist/skills/idea-discovery-robot/SKILL.md +362 -0
- package/dist/skills/idea-evaluator/SKILL.md +265 -0
- package/dist/skills/idea-evaluator/references/fatal-flaws.md +192 -0
- package/dist/skills/idea-evaluator/references/five-dimensions.md +251 -0
- package/dist/skills/idea-evaluator/references/lifecycle-capability-matching.md +177 -0
- package/dist/skills/idea-evaluator/references/paradigm-elephant.md +112 -0
- package/dist/skills/idea-evaluator/references/paradigm-examples.md +107 -0
- package/dist/skills/idea-evaluator/references/paradigm-first-principles.md +115 -0
- package/dist/skills/idea-evaluator/references/paradigm-hamming.md +137 -0
- package/dist/skills/idea-evaluator/references/paradigm-shift-probe.md +160 -0
- package/dist/skills/idea-evaluator/references/paradigm-technology-cycle.md +116 -0
- package/dist/skills/idea-evaluator/references/worked-examples.md +206 -0
- package/dist/skills/interview-cheatsheet/SKILL.md +245 -0
- package/dist/skills/intro-drafter/SKILL.md +250 -0
- package/dist/skills/intro-drafter/references/contribution-patterns.md +116 -0
- package/dist/skills/intro-drafter/references/flowchart.md +204 -0
- package/dist/skills/intro-drafter/references/paper-types.md +155 -0
- package/dist/skills/intro-drafter/references/running-example.md +133 -0
- package/dist/skills/intro-drafter/references/worked-examples.md +161 -0
- package/dist/skills/invention-structuring/SKILL.md +188 -0
- package/dist/skills/jurisdiction-format/SKILL.md +192 -0
- package/dist/skills/kill-argument/SKILL.md +384 -0
- package/dist/skills/llm-wiki/.mise.toml +2 -0
- package/dist/skills/llm-wiki/.nvmrc +1 -0
- package/dist/skills/llm-wiki/AGENTS.md +132 -0
- package/dist/skills/llm-wiki/CHANGELOG.md +459 -0
- package/dist/skills/llm-wiki/CLAUDE.md +109 -0
- package/dist/skills/llm-wiki/HERMES.md +44 -0
- package/dist/skills/llm-wiki/SKILL.md +1133 -0
- package/dist/skills/llm-wiki/assets/graph-demo.gif +0 -0
- package/dist/skills/llm-wiki/assets/graph-preview.png +0 -0
- package/dist/skills/llm-wiki/deps/LICENSE-d3.txt +13 -0
- package/dist/skills/llm-wiki/deps/LICENSE-marked.txt +44 -0
- package/dist/skills/llm-wiki/deps/LICENSE-purify.txt +568 -0
- package/{LICENSE → dist/skills/llm-wiki/deps/LICENSE-roughjs.txt} +1 -1
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/SKILL.md +261 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
- package/dist/skills/llm-wiki/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
- package/dist/skills/llm-wiki/deps/d3.min.js +2 -0
- package/dist/skills/llm-wiki/deps/marked.min.js +6 -0
- package/dist/skills/llm-wiki/deps/purify.min.js +3 -0
- package/dist/skills/llm-wiki/deps/rough.min.js +7 -0
- package/dist/skills/llm-wiki/deps/youtube-transcript/SKILL.md +47 -0
- package/dist/skills/llm-wiki/deps/youtube-transcript/scripts/get_transcript.py +72 -0
- package/dist/skills/llm-wiki/docs/design/oriental-atlas/DESIGN.md +183 -0
- package/dist/skills/llm-wiki/docs/design/oriental-atlas/design-brief.md +170 -0
- package/dist/skills/llm-wiki/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
- package/dist/skills/llm-wiki/docs/design/oriental-atlas/reviews/result-review.md +68 -0
- package/dist/skills/llm-wiki/docs/plans/2026-06-15-omp-tool-status-events-phased-plan.md +655 -0
- package/dist/skills/llm-wiki/docs/plans/2026-06-15-omp-tool-status-events-progress.json +913 -0
- package/dist/skills/llm-wiki/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
- package/dist/skills/llm-wiki/install.ps1 +87 -0
- package/dist/skills/llm-wiki/install.sh +722 -0
- package/dist/skills/llm-wiki/package-lock.json +10309 -0
- package/dist/skills/llm-wiki/package.json +24 -0
- package/dist/skills/llm-wiki/packages/graph-engine/package.json +33 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/anim/.gitkeep +1 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/anim/index.ts +179 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/diff.ts +121 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/graph-node.ts +37 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/index.ts +140 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/atlas.ts +18 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/index.ts +6 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/labels.ts +11 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/learning.ts +8 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/legacy-helpers.ts +1373 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/queue.ts +7 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/storage.ts +4 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/model/visibility.ts +9 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/.gitkeep +1 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/index.ts +59 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/legend.ts +25 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/model.ts +593 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/preview.ts +65 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/search.ts +48 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/static-renderer.ts +2783 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/toolbar.ts +40 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/render/viewport.ts +272 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/select/.gitkeep +1 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/select/index.ts +189 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/sim/index.ts +298 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/sim/pins.ts +96 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/themes/.gitkeep +1 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/themes/index.ts +8 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/themes/tokens.ts +107 -0
- package/dist/skills/llm-wiki/packages/graph-engine/src/types.ts +313 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/anim.test.ts +100 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/diff.test.ts +133 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/helpers.test.ts +275 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/learning.test.ts +259 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/preview.test.ts +56 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/queue.test.ts +114 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/render-model.test.ts +322 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/runtime-state.test.ts +281 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/search-and-legend.test.ts +111 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/select.test.ts +168 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/sim.test.ts +123 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/themes.test.ts +62 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/toolbar.test.ts +64 -0
- package/dist/skills/llm-wiki/packages/graph-engine/test/viewport.test.ts +167 -0
- package/dist/skills/llm-wiki/packages/graph-engine/tsconfig.json +17 -0
- package/dist/skills/llm-wiki/packages/graph-engine/vite.config.ts +15 -0
- package/dist/skills/llm-wiki/platforms/claude/CLAUDE.md +37 -0
- package/dist/skills/llm-wiki/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
- package/dist/skills/llm-wiki/platforms/codex/AGENTS.md +23 -0
- package/dist/skills/llm-wiki/scripts/adapter-state.sh +424 -0
- package/dist/skills/llm-wiki/scripts/build-graph-data.sh +395 -0
- package/dist/skills/llm-wiki/scripts/build-graph-html.sh +453 -0
- package/dist/skills/llm-wiki/scripts/cache.sh +352 -0
- package/dist/skills/llm-wiki/scripts/create-source-page.sh +100 -0
- package/dist/skills/llm-wiki/scripts/delete-helper.sh +68 -0
- package/dist/skills/llm-wiki/scripts/graph-analysis.js +732 -0
- package/dist/skills/llm-wiki/scripts/hook-session-start.sh +46 -0
- package/dist/skills/llm-wiki/scripts/init-wiki.sh +95 -0
- package/dist/skills/llm-wiki/scripts/lib/source-signal-eligibility.js +158 -0
- package/dist/skills/llm-wiki/scripts/lint-fix.sh +114 -0
- package/dist/skills/llm-wiki/scripts/lint-runner.sh +217 -0
- package/dist/skills/llm-wiki/scripts/runtime-context.sh +77 -0
- package/dist/skills/llm-wiki/scripts/shared-config.sh +83 -0
- package/dist/skills/llm-wiki/scripts/source-record-contract.tsv +10 -0
- package/dist/skills/llm-wiki/scripts/source-registry.sh +349 -0
- package/dist/skills/llm-wiki/scripts/source-registry.tsv +10 -0
- package/dist/skills/llm-wiki/scripts/source-signal-coverage.js +83 -0
- package/dist/skills/llm-wiki/scripts/validate-step1.sh +144 -0
- package/dist/skills/llm-wiki/scripts/wiki-compat.sh +267 -0
- package/dist/skills/llm-wiki/setup.sh +8 -0
- package/dist/skills/llm-wiki/templates/entity-template.md +30 -0
- package/dist/skills/llm-wiki/templates/graph-styles/wash/footer.html +27 -0
- package/dist/skills/llm-wiki/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
- package/dist/skills/llm-wiki/templates/graph-styles/wash/graph-wash.js +1009 -0
- package/dist/skills/llm-wiki/templates/graph-styles/wash/header.html +2002 -0
- package/dist/skills/llm-wiki/templates/index-en-template.md +51 -0
- package/dist/skills/llm-wiki/templates/index-template.md +51 -0
- package/dist/skills/llm-wiki/templates/log-en-template.md +11 -0
- package/dist/skills/llm-wiki/templates/log-template.md +11 -0
- package/dist/skills/llm-wiki/templates/overview-en-template.md +41 -0
- package/dist/skills/llm-wiki/templates/overview-template.md +41 -0
- package/dist/skills/llm-wiki/templates/purpose-en-template.md +16 -0
- package/dist/skills/llm-wiki/templates/purpose-template.md +16 -0
- package/dist/skills/llm-wiki/templates/query-template.md +19 -0
- package/dist/skills/llm-wiki/templates/schema-template.md +185 -0
- package/dist/skills/llm-wiki/templates/source-template.md +51 -0
- package/dist/skills/llm-wiki/templates/synthesis-template.md +25 -0
- package/dist/skills/llm-wiki/templates/topic-template.md +35 -0
- package/dist/skills/llm-wiki/tests/adapter-state.sh +338 -0
- package/dist/skills/llm-wiki/tests/browser/graph-density-preview.mjs +53 -0
- package/dist/skills/llm-wiki/tests/browser/graph-html-insights.mjs +41 -0
- package/dist/skills/llm-wiki/tests/browser/graph-node-slim.mjs +71 -0
- package/dist/skills/llm-wiki/tests/browser/graph-stage-4-5.mjs +717 -0
- package/dist/skills/llm-wiki/tests/expected/graph-data-empty.json +60 -0
- package/dist/skills/llm-wiki/tests/expected/graph-data-sample.json +396 -0
- package/dist/skills/llm-wiki/tests/expected/graph-interactive-basic.html +1736 -0
- package/dist/skills/llm-wiki/tests/expected/lint-output.txt +44 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/index.md +1 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
- package/dist/skills/llm-wiki/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
- package/dist/skills/llm-wiki/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/index.md +14 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
- package/dist/skills/llm-wiki/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
- package/dist/skills/llm-wiki/tests/graph-analysis-helper.regression-1.sh +237 -0
- package/dist/skills/llm-wiki/tests/graph-browser-stage-4-5.regression-1.sh +157 -0
- package/dist/skills/llm-wiki/tests/graph-build-failures.regression-1.sh +91 -0
- package/dist/skills/llm-wiki/tests/graph-data-confidence-merge.regression-1.sh +309 -0
- package/dist/skills/llm-wiki/tests/graph-data-source-paths.regression-1.sh +49 -0
- package/dist/skills/llm-wiki/tests/graph-html-a11y.regression-1.sh +47 -0
- package/dist/skills/llm-wiki/tests/graph-html-brand-link.regression-1.sh +47 -0
- package/dist/skills/llm-wiki/tests/graph-html-density.regression-1.sh +228 -0
- package/dist/skills/llm-wiki/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
- package/dist/skills/llm-wiki/tests/graph-html-insights.regression-1.sh +80 -0
- package/dist/skills/llm-wiki/tests/graph-html-long-label.regression-1.sh +92 -0
- package/dist/skills/llm-wiki/tests/graph-html-minimap.regression-1.sh +51 -0
- package/dist/skills/llm-wiki/tests/graph-html-mobile.regression-1.sh +48 -0
- package/dist/skills/llm-wiki/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
- package/dist/skills/llm-wiki/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
- package/dist/skills/llm-wiki/tests/graph-html-search.regression-1.sh +52 -0
- package/dist/skills/llm-wiki/tests/graph-html-styles.regression-1.sh +66 -0
- package/dist/skills/llm-wiki/tests/graph-html-toolbar.regression-1.sh +62 -0
- package/dist/skills/llm-wiki/tests/js/graph-wash-bootstrap.test.js +110 -0
- package/dist/skills/llm-wiki/tests/js/graph-wash-helpers.test.js +296 -0
- package/dist/skills/llm-wiki/tests/js/graph-wash-learning.test.js +260 -0
- package/dist/skills/llm-wiki/tests/js/graph-wash-queue.test.js +115 -0
- package/dist/skills/llm-wiki/tests/js/graph-wash-runtime-state.test.js +282 -0
- package/dist/skills/llm-wiki/tests/js/source-signal-coverage.test.js +48 -0
- package/dist/skills/llm-wiki/tests/js/source-signal-eligibility.test.js +202 -0
- package/dist/skills/llm-wiki/tests/lib/graph-html-engine-helpers.sh +110 -0
- package/dist/skills/llm-wiki/tests/lint-output.regression-1.sh +32 -0
- package/dist/skills/llm-wiki/tests/regression.sh +1754 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/.gitkeep +0 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/SKILL.md +590 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/__init__.py +1 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/accept_changes.py +135 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/comment.py +318 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/pack.py +159 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/soffice.py +183 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/unpack.py +132 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/validate.py +111 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/validators/base.py +847 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/validators/docx.py +446 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/templates/comments.xml +3 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/docx/scripts/templates/people.xml +3 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/SKILL.md +314 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/forms.md +294 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/reference.md +612 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/create_validation_image.py +37 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/SKILL.md +232 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/editing.md +205 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/pptxgenjs.md +420 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/__init__.py +0 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/add_slide.py +195 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/clean.py +286 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/pack.py +159 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/soffice.py +183 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/unpack.py +132 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/validate.py +111 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/validators/base.py +847 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/pptx/scripts/thumbnail.py +289 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/SKILL.md +292 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/pack.py +159 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/soffice.py +183 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/unpack.py +132 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/validate.py +111 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/dist/skills/llm-wiki/workbench/.claude/skills/xlsx/scripts/recalc.py +184 -0
- package/dist/skills/llm-wiki/workbench/AGENTS.md +110 -0
- package/dist/skills/llm-wiki/workbench/CLAUDE.md +54 -0
- package/dist/skills/llm-wiki/workbench/PRODUCT.md +1268 -0
- package/dist/skills/llm-wiki/workbench/docs/current-kb-retrieval-design.md +587 -0
- package/dist/skills/llm-wiki/workbench/docs/graph-evolution-1-design.md +210 -0
- package/dist/skills/llm-wiki/workbench/docs/stage-2-design.md +1139 -0
- package/dist/skills/llm-wiki/workbench/docs/stage-3-design.md +1269 -0
- package/dist/skills/llm-wiki/workbench/docs/stage-3.5-design.md +1164 -0
- package/dist/skills/llm-wiki/workbench/docs/stage-4-design.md +504 -0
- package/dist/skills/llm-wiki/workbench/docs/stage-4.5-design.md +195 -0
- package/dist/skills/llm-wiki/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
- package/dist/skills/llm-wiki/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
- package/dist/skills/llm-wiki/workbench/server/package.json +29 -0
- package/dist/skills/llm-wiki/workbench/server/src/agent.ts +457 -0
- package/dist/skills/llm-wiki/workbench/server/src/artifacts.ts +248 -0
- package/dist/skills/llm-wiki/workbench/server/src/auth.ts +164 -0
- package/dist/skills/llm-wiki/workbench/server/src/config.ts +130 -0
- package/dist/skills/llm-wiki/workbench/server/src/conversations.test.ts +121 -0
- package/dist/skills/llm-wiki/workbench/server/src/conversations.ts +255 -0
- package/dist/skills/llm-wiki/workbench/server/src/digest/batch.ts +189 -0
- package/dist/skills/llm-wiki/workbench/server/src/digest/concurrency.test.ts +36 -0
- package/dist/skills/llm-wiki/workbench/server/src/digest/concurrency.ts +31 -0
- package/dist/skills/llm-wiki/workbench/server/src/digest/subagent.ts +91 -0
- package/dist/skills/llm-wiki/workbench/server/src/extensions/artifacts.ts +81 -0
- package/dist/skills/llm-wiki/workbench/server/src/extensions/knowledge-base.ts +263 -0
- package/dist/skills/llm-wiki/workbench/server/src/extensions/new-wiki.ts +42 -0
- package/dist/skills/llm-wiki/workbench/server/src/extensions/synthesis.ts +172 -0
- package/dist/skills/llm-wiki/workbench/server/src/graph-watcher.test.ts +196 -0
- package/dist/skills/llm-wiki/workbench/server/src/graph.test.ts +84 -0
- package/dist/skills/llm-wiki/workbench/server/src/graph.ts +379 -0
- package/dist/skills/llm-wiki/workbench/server/src/index.ts +1148 -0
- package/dist/skills/llm-wiki/workbench/server/src/knowledge-bases.test.ts +30 -0
- package/dist/skills/llm-wiki/workbench/server/src/knowledge-bases.ts +321 -0
- package/dist/skills/llm-wiki/workbench/server/src/pages.test.ts +16 -0
- package/dist/skills/llm-wiki/workbench/server/src/pages.ts +158 -0
- package/dist/skills/llm-wiki/workbench/server/src/retrieval.test.ts +151 -0
- package/dist/skills/llm-wiki/workbench/server/src/retrieval.ts +427 -0
- package/dist/skills/llm-wiki/workbench/server/src/tool-status-events.test.ts +363 -0
- package/dist/skills/llm-wiki/workbench/server/src/tool-status-events.ts +616 -0
- package/dist/skills/llm-wiki/workbench/server/src/wiki-init.test.ts +19 -0
- package/dist/skills/llm-wiki/workbench/server/src/wiki-init.ts +188 -0
- package/dist/skills/llm-wiki/workbench/server/tsconfig.json +10 -0
- package/dist/skills/llm-wiki/workbench/tsconfig.json +20 -0
- package/dist/skills/llm-wiki/workbench/web/components.json +21 -0
- package/dist/skills/llm-wiki/workbench/web/eslint.config.js +22 -0
- package/dist/skills/llm-wiki/workbench/web/index.html +13 -0
- package/dist/skills/llm-wiki/workbench/web/package.json +48 -0
- package/dist/skills/llm-wiki/workbench/web/src/App.tsx +749 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/AddExternalDialog.tsx +373 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ArtifactView.tsx +15 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/BatchDigestPanel.tsx +106 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ChatPanel.tsx +821 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/CommandMenu.tsx +65 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ExportButtons.tsx +54 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/GraphPanel.tsx +516 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/GraphReader.tsx +48 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/GraphSelection.tsx +100 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/MarkdownView.tsx +56 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/NewWikiDialog.tsx +101 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/RefMenu.tsx +40 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/RightDrawer.tsx +227 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/SettingsPanel.tsx +331 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/Sidebar.tsx +436 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ToolHistorySummary.tsx +123 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ToolStatusRunway.tsx +90 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ui/button.tsx +52 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ui/command.tsx +50 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ui/dialog.tsx +156 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ui/input.tsx +21 -0
- package/dist/skills/llm-wiki/workbench/web/src/components/ui/tooltip.tsx +57 -0
- package/dist/skills/llm-wiki/workbench/web/src/index.css +1737 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/api.ts +648 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/drawer-state.ts +79 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/graph-reader.ts +25 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/graph-selection.ts +96 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/legacy-tool-status.ts +113 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/sse.ts +72 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/tool-status-format.ts +170 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/tool-status-model.ts +392 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/utils.ts +10 -0
- package/dist/skills/llm-wiki/workbench/web/src/lib/wiki-links.ts +32 -0
- package/dist/skills/llm-wiki/workbench/web/src/main.tsx +10 -0
- package/dist/skills/llm-wiki/workbench/web/test/api.test.ts +61 -0
- package/dist/skills/llm-wiki/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
- package/dist/skills/llm-wiki/workbench/web/test/graph-drawer-state.test.ts +78 -0
- package/dist/skills/llm-wiki/workbench/web/test/graph-reader-request.test.ts +32 -0
- package/dist/skills/llm-wiki/workbench/web/test/graph-reader.test.ts +62 -0
- package/dist/skills/llm-wiki/workbench/web/test/graph-selection-drawer.test.ts +56 -0
- package/dist/skills/llm-wiki/workbench/web/test/graph-selection.test.ts +83 -0
- package/dist/skills/llm-wiki/workbench/web/test/tool-history-summary.test.tsx +124 -0
- package/dist/skills/llm-wiki/workbench/web/test/tool-status-format.test.ts +107 -0
- package/dist/skills/llm-wiki/workbench/web/test/tool-status-model.test.ts +324 -0
- package/dist/skills/llm-wiki/workbench/web/test/tool-status-runway.test.ts +134 -0
- package/dist/skills/llm-wiki/workbench/web/test/wiki-links.test.ts +23 -0
- package/dist/skills/llm-wiki/workbench/web/tsconfig.app.json +30 -0
- package/dist/skills/llm-wiki/workbench/web/tsconfig.json +7 -0
- package/dist/skills/llm-wiki/workbench/web/tsconfig.node.json +24 -0
- package/dist/skills/llm-wiki/workbench/web/vite.config.ts +26 -0
- package/dist/skills/mean-reviewer/SECURITY.md +23 -0
- package/dist/skills/mean-reviewer/SKILL.md +203 -0
- package/dist/skills/mean-reviewer/examples/13446_1000_Layer_Networks_for_.pdf +0 -0
- package/dist/skills/mean-reviewer/examples/13446_mean_reviewer.md +116 -0
- package/dist/skills/mean-reviewer/examples/13446_mean_reviewer_author_rebuttal_simulated.md +282 -0
- package/dist/skills/mean-reviewer/examples/13446_mean_reviewer_reply.md +91 -0
- package/dist/skills/mean-reviewer/examples/13446_official_review.json +973 -0
- package/dist/skills/mean-reviewer/examples/ChatGPT_AC_Roleplay.jpeg +0 -0
- package/dist/skills/medical-imaging-review/SKILL.md +295 -0
- package/dist/skills/medical-imaging-review/references/CITATION_INTEGRITY.md +233 -0
- package/dist/skills/medical-imaging-review/references/DOMAINS.md +302 -0
- package/dist/skills/medical-imaging-review/references/HALLUCINATION_PATTERNS.md +211 -0
- package/dist/skills/medical-imaging-review/references/MCP_SETUP.md +216 -0
- package/dist/skills/medical-imaging-review/references/PARADIGM.md +221 -0
- package/dist/skills/medical-imaging-review/references/QUALITY_CHECKLIST.md +169 -0
- package/dist/skills/medical-imaging-review/references/TEMPLATES.md +291 -0
- package/dist/skills/medical-imaging-review/references/WORKFLOW.md +289 -0
- package/dist/skills/mermaid-diagram/SKILL.md +379 -0
- package/dist/skills/meta-apply/SKILL.md +137 -0
- package/dist/skills/meta-optimize/SKILL.md +253 -0
- package/dist/skills/monitor-experiment/SKILL.md +98 -0
- package/dist/skills/novelty-check/SKILL.md +89 -0
- package/dist/skills/openalex/SKILL.md +228 -0
- package/dist/skills/overleaf-sync/SKILL.md +220 -0
- package/dist/skills/paper-claim-audit/SKILL.md +340 -0
- package/dist/skills/paper-compile/SKILL.md +253 -0
- package/dist/skills/paper-figure/SKILL.md +279 -0
- package/dist/skills/paper-illustration/SKILL.md +690 -0
- package/dist/skills/paper-illustration-image2/SKILL.md +383 -0
- package/dist/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/dist/skills/paper-plan/SKILL.md +278 -0
- package/dist/skills/paper-poster/SKILL.md +19 -0
- package/dist/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
- package/dist/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
- package/dist/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
- package/dist/skills/paper-poster-html/NOTICE.md +57 -0
- package/dist/skills/paper-poster-html/SKILL.md +357 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
- package/dist/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
- package/dist/skills/paper-poster-html/scripts/asset_check.py +897 -0
- package/dist/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
- package/dist/skills/paper-poster-html/scripts/poster_check.py +251 -0
- package/dist/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
- package/dist/skills/paper-poster-html/scripts/render_preview.py +217 -0
- package/dist/skills/paper-poster-html/scripts/run_gates.py +556 -0
- package/dist/skills/paper-poster-html/scripts/style_check.py +1324 -0
- package/dist/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
- package/dist/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
- package/dist/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
- package/dist/skills/paper-poster-html/templates/portrait_2col.html +947 -0
- package/dist/skills/paper-poster-html/templates/tokens/acl.json +9 -0
- package/dist/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
- package/dist/skills/paper-poster-html/templates/tokens/generic.json +9 -0
- package/dist/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
- package/dist/skills/paper-poster-html/templates/tokens/icml.json +9 -0
- package/dist/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
- package/dist/skills/paper-slide-deck/SKILL.md +464 -0
- package/dist/skills/paper-slide-deck/references/analysis-framework.md +392 -0
- package/dist/skills/paper-slide-deck/references/base-prompt.md +70 -0
- package/dist/skills/paper-slide-deck/references/content-rules.md +95 -0
- package/dist/skills/paper-slide-deck/references/figure-container-template.md +177 -0
- package/dist/skills/paper-slide-deck/references/modification-guide.md +85 -0
- package/dist/skills/paper-slide-deck/references/outline-template.md +437 -0
- package/dist/skills/paper-slide-deck/references/styles/academic-paper.md +109 -0
- package/dist/skills/paper-slide-deck/references/styles/blueprint.md +67 -0
- package/dist/skills/paper-slide-deck/references/styles/bold-editorial.md +70 -0
- package/dist/skills/paper-slide-deck/references/styles/chalkboard.md +68 -0
- package/dist/skills/paper-slide-deck/references/styles/corporate.md +69 -0
- package/dist/skills/paper-slide-deck/references/styles/dark-atmospheric.md +69 -0
- package/dist/skills/paper-slide-deck/references/styles/editorial-infographic.md +73 -0
- package/dist/skills/paper-slide-deck/references/styles/fantasy-animation.md +69 -0
- package/dist/skills/paper-slide-deck/references/styles/intuition-machine.md +72 -0
- package/dist/skills/paper-slide-deck/references/styles/minimal.md +64 -0
- package/dist/skills/paper-slide-deck/references/styles/notion.md +69 -0
- package/dist/skills/paper-slide-deck/references/styles/pixel-art.md +67 -0
- package/dist/skills/paper-slide-deck/references/styles/scientific.md +73 -0
- package/dist/skills/paper-slide-deck/references/styles/sketch-notes.md +66 -0
- package/dist/skills/paper-slide-deck/references/styles/vector-illustration.md +72 -0
- package/dist/skills/paper-slide-deck/references/styles/vintage.md +73 -0
- package/dist/skills/paper-slide-deck/references/styles/watercolor.md +68 -0
- package/dist/skills/paper-slide-deck/scripts/apply-template.ts +282 -0
- package/dist/skills/paper-slide-deck/scripts/detect-figures.ts +283 -0
- package/dist/skills/paper-slide-deck/scripts/extract-figure.ts +140 -0
- package/dist/skills/paper-slide-deck/scripts/generate-slides.py +182 -0
- package/dist/skills/paper-slide-deck/scripts/merge-to-pdf.ts +116 -0
- package/dist/skills/paper-slide-deck/scripts/merge-to-pptx.ts +137 -0
- package/dist/skills/paper-slide-deck/scripts/package-lock.json +899 -0
- package/dist/skills/paper-slide-deck/scripts/package.json +8 -0
- package/dist/skills/paper-slides/SKILL.md +571 -0
- package/dist/skills/paper-talk/SKILL.md +381 -0
- package/dist/skills/paper-write/SKILL.md +411 -0
- package/dist/skills/paper-write/templates/IEEEtran.bst +2409 -0
- package/dist/skills/paper-write/templates/IEEEtran.cls +6347 -0
- package/dist/skills/paper-write/templates/aaai2026.bst +1493 -0
- package/dist/skills/paper-write/templates/aaai2026.sty +315 -0
- package/dist/skills/paper-write/templates/aaai2026.tex +952 -0
- package/dist/skills/paper-write/templates/acl.sty +312 -0
- package/dist/skills/paper-write/templates/acl2026.tex +377 -0
- package/dist/skills/paper-write/templates/acl_natbib.bst +1940 -0
- package/dist/skills/paper-write/templates/acm.bst +3081 -0
- package/dist/skills/paper-write/templates/acm_mm2026.tex +204 -0
- package/dist/skills/paper-write/templates/acmart.cls +3520 -0
- package/dist/skills/paper-write/templates/cvpr.bst +1448 -0
- package/dist/skills/paper-write/templates/cvpr.sty +508 -0
- package/dist/skills/paper-write/templates/cvpr2026.tex +63 -0
- package/dist/skills/paper-write/templates/iclr2026.tex +84 -0
- package/dist/skills/paper-write/templates/iclr2026_conference.bst +1440 -0
- package/dist/skills/paper-write/templates/iclr2026_conference.sty +246 -0
- package/dist/skills/paper-write/templates/icml2025.tex +87 -0
- package/dist/skills/paper-write/templates/icml2026.sty +767 -0
- package/dist/skills/paper-write/templates/icml2026.tex +662 -0
- package/dist/skills/paper-write/templates/ieee_conference.tex +89 -0
- package/dist/skills/paper-write/templates/ieee_journal.tex +93 -0
- package/dist/skills/paper-write/templates/math_commands.tex +48 -0
- package/dist/skills/paper-write/templates/neurips2025.tex +80 -0
- package/dist/skills/paper-write/templates/neurips2026.tex +493 -0
- package/dist/skills/paper-write/templates/neurips_2026.sty +437 -0
- package/dist/skills/paper-writing/SKILL.md +632 -0
- package/dist/skills/patent-novelty-check/SKILL.md +153 -0
- package/dist/skills/patent-pipeline/SKILL.md +344 -0
- package/dist/skills/patent-review/SKILL.md +202 -0
- package/dist/skills/pixel-art/SKILL.md +139 -0
- package/dist/skills/pre-submission-reviewer/SKILL.md +247 -0
- package/dist/skills/pre-submission-reviewer/references/forbidden-patterns.md +163 -0
- package/dist/skills/pre-submission-reviewer/references/grammar-rules.md +135 -0
- package/dist/skills/pre-submission-reviewer/references/latex-rules.md +158 -0
- package/dist/skills/pre-submission-reviewer/references/logic-and-structure.md +125 -0
- package/dist/skills/pre-submission-reviewer/references/section-guides.md +169 -0
- package/dist/skills/prior-art-search/SKILL.md +146 -0
- package/dist/skills/proof-checker/SKILL.md +499 -0
- package/dist/skills/proof-writer/SKILL.md +222 -0
- package/dist/skills/qzcli/SKILL.md +316 -0
- package/dist/skills/rebuttal/SKILL.md +304 -0
- package/dist/skills/render-html/SKILL.md +299 -0
- package/dist/skills/render-html/scripts/render_html.py +905 -0
- package/dist/skills/render-html/scripts/templates/academic.html +342 -0
- package/dist/skills/render-html/scripts/templates/dashboard.html +333 -0
- package/dist/skills/research-lit/SKILL.md +353 -0
- package/dist/skills/research-paper-writing/SKILL.md +99 -0
- package/dist/skills/research-paper-writing/agents/openai.yaml +4 -0
- package/dist/skills/research-paper-writing/references/abstract.md +102 -0
- package/dist/skills/research-paper-writing/references/conclusion.md +35 -0
- package/dist/skills/research-paper-writing/references/does-my-writing-flow-source.md +45 -0
- package/dist/skills/research-paper-writing/references/examples/abstract/template-a.md +21 -0
- package/dist/skills/research-paper-writing/references/examples/abstract/template-b.md +34 -0
- package/dist/skills/research-paper-writing/references/examples/abstract/template-c.md +28 -0
- package/dist/skills/research-paper-writing/references/examples/abstract-examples.md +13 -0
- package/dist/skills/research-paper-writing/references/examples/index.md +21 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/novel-task-challenge-decomposition.md +18 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/pipeline-not-recommended-abstract-only.md +30 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/pipeline-version-1-one-contribution-multi-advantages.md +30 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/pipeline-version-2-two-contributions.md +34 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/pipeline-version-3-new-module-on-existing-pipeline.md +18 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/pipeline-version-4-observation-driven.md +16 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/technical-challenge-version-1-existing-task.md +32 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/technical-challenge-version-2-existing-task-insight-backed-by-traditional.md +33 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/technical-challenge-version-3-novel-task.md +21 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/version-1-task-then-application.md +14 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/version-2-application-first.md +10 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/version-3-general-to-specific-setting.md +14 -0
- package/dist/skills/research-paper-writing/references/examples/introduction/version-4-open-with-challenge.md +20 -0
- package/dist/skills/research-paper-writing/references/examples/introduction-examples.md +25 -0
- package/dist/skills/research-paper-writing/references/examples/method/example-of-the-three-elements.md +67 -0
- package/dist/skills/research-paper-writing/references/examples/method/method-writing-common-issues-note.md +10 -0
- package/dist/skills/research-paper-writing/references/examples/method/module-design-instant-ngp.md +55 -0
- package/dist/skills/research-paper-writing/references/examples/method/module-motivation-patterns.md +15 -0
- package/dist/skills/research-paper-writing/references/examples/method/module-triad-neural-body.md +19 -0
- package/dist/skills/research-paper-writing/references/examples/method/neural-body-annotated-figure-text.md +66 -0
- package/dist/skills/research-paper-writing/references/examples/method/overview-template.md +30 -0
- package/dist/skills/research-paper-writing/references/examples/method/pre-writing-questions.md +17 -0
- package/dist/skills/research-paper-writing/references/examples/method/section-skeleton.md +9 -0
- package/dist/skills/research-paper-writing/references/examples/method-examples.md +24 -0
- package/dist/skills/research-paper-writing/references/experiments.md +102 -0
- package/dist/skills/research-paper-writing/references/introduction.md +408 -0
- package/dist/skills/research-paper-writing/references/method.md +196 -0
- package/dist/skills/research-paper-writing/references/paper-review.md +86 -0
- package/dist/skills/research-paper-writing/references/related-work.md +41 -0
- package/dist/skills/research-pipeline/SKILL.md +257 -0
- package/dist/skills/research-proposal/SKILL.md +573 -0
- package/dist/skills/research-proposal/assets/proposal_scaffold_en.md +323 -0
- package/dist/skills/research-proposal/assets/proposal_scaffold_zh.md +346 -0
- package/dist/skills/research-proposal/references/DOMAIN_TEMPLATES.md +518 -0
- package/dist/skills/research-proposal/references/LITERATURE_WORKFLOW.md +529 -0
- package/dist/skills/research-proposal/references/QUALITY_CHECKLIST.md +325 -0
- package/dist/skills/research-proposal/references/STRUCTURE_GUIDE.md +398 -0
- package/dist/skills/research-proposal/references/WRITING_STYLE_GUIDE.md +661 -0
- package/dist/skills/research-refine/SKILL.md +716 -0
- package/dist/skills/research-refine-pipeline/SKILL.md +186 -0
- package/dist/skills/research-review/SKILL.md +119 -0
- package/dist/skills/research-wiki/SKILL.md +373 -0
- package/dist/skills/resubmit-pipeline/SKILL.md +427 -0
- package/dist/skills/result-to-claim/SKILL.md +190 -0
- package/dist/skills/run-experiment/SKILL.md +227 -0
- package/dist/skills/scientific-figure-making/SKILL.md +38 -0
- package/dist/skills/scientific-figure-making/references/api.md +152 -0
- package/dist/skills/scientific-figure-making/references/common-patterns.md +74 -0
- package/dist/skills/scientific-figure-making/references/demos.md +30 -0
- package/dist/skills/scientific-figure-making/references/design-theory.md +138 -0
- package/dist/skills/scientific-figure-making/references/tutorials.md +135 -0
- package/dist/skills/semantic-scholar/SKILL.md +219 -0
- package/dist/skills/serverless-modal/SKILL.md +324 -0
- package/dist/skills/slides-polish/SKILL.md +563 -0
- package/dist/skills/specification-writing/SKILL.md +211 -0
- package/dist/skills/strategist/SKILL.md +670 -0
- package/dist/skills/strategist/references/quality_standards.md +336 -0
- package/dist/skills/strategist/references/search_strategy.md +459 -0
- package/dist/skills/strategist/scripts/evaluate_samples.py +300 -0
- package/dist/skills/strategist/scripts/gap_analysis.py +399 -0
- package/dist/skills/system-profile/SKILL.md +103 -0
- package/dist/skills/tech-paper-template/SKILL.md +192 -0
- package/dist/skills/tech-paper-template/references/consistency-checks.md +166 -0
- package/dist/skills/tech-paper-template/references/paper-types.md +127 -0
- package/dist/skills/tech-paper-template/references/thinking-template.md +194 -0
- package/dist/skills/tech-paper-template/references/worked-examples.md +124 -0
- package/dist/skills/training-check/SKILL.md +83 -0
- package/dist/skills/vast-gpu/SKILL.md +380 -0
- package/dist/skills/vibe-research-workflow/SKILL.md +189 -0
- package/dist/skills/vibe-research-workflow/references/behavior-guidelines.md +149 -0
- package/dist/skills/vibe-research-workflow/references/tool-selection.md +144 -0
- package/dist/skills/vibe-research-workflow/references/vibe-coding.md +154 -0
- package/dist/skills/vibe-research-workflow/references/vibe-figure.md +131 -0
- package/dist/skills/vibe-research-workflow/references/vibe-writing.md +181 -0
- package/dist/skills/wiki-enrich/SKILL.md +254 -0
- package/dist/skills/writing-systems-papers/SKILL.md +184 -0
- package/package.json +1 -1
|
@@ -0,0 +1,717 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const { chromium } = require("playwright");
|
|
9
|
+
|
|
10
|
+
const target = process.env.GRAPH_STAGE_4_5_TARGET || "offline";
|
|
11
|
+
const offlineHtml = process.env.GRAPH_STAGE_4_5_OFFLINE_HTML || "";
|
|
12
|
+
const denseHtml = process.env.GRAPH_STAGE_4_5_DENSE_HTML || "";
|
|
13
|
+
const artifactDir = process.env.GRAPH_STAGE_4_5_ARTIFACT_DIR || "";
|
|
14
|
+
const workbenchUrl = process.env.GRAPH_STAGE_4_5_WORKBENCH_URL || "";
|
|
15
|
+
|
|
16
|
+
if (target !== "offline" && target !== "workbench") {
|
|
17
|
+
throw new Error(`Unknown stage 4.5 browser target: ${target}`);
|
|
18
|
+
}
|
|
19
|
+
assert.notEqual(offlineHtml, "", "GRAPH_STAGE_4_5_OFFLINE_HTML must point at generated HTML");
|
|
20
|
+
assert.notEqual(denseHtml, "", "GRAPH_STAGE_4_5_DENSE_HTML must point at generated dense HTML");
|
|
21
|
+
|
|
22
|
+
const browser = await chromium.launch();
|
|
23
|
+
try {
|
|
24
|
+
if (target === "workbench") {
|
|
25
|
+
await runWorkbenchChecks(browser);
|
|
26
|
+
} else {
|
|
27
|
+
await runOfflineChecks(browser);
|
|
28
|
+
}
|
|
29
|
+
} finally {
|
|
30
|
+
await browser.close();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function runOfflineChecks(browser) {
|
|
34
|
+
const page = await browser.newPage({ viewport: { width: 1440, height: 960 } });
|
|
35
|
+
await page.goto(pathToFileURL(offlineHtml).href);
|
|
36
|
+
|
|
37
|
+
await page.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
38
|
+
await page.waitForSelector("[data-viewport-layer='true']");
|
|
39
|
+
await runOfflineThemeChecks(page);
|
|
40
|
+
|
|
41
|
+
const initial = await layerTransform(page);
|
|
42
|
+
await page.mouse.move(64, 120);
|
|
43
|
+
await page.mouse.wheel(0, -600);
|
|
44
|
+
const zoomed = await waitForLayerTransform(page, initial);
|
|
45
|
+
assert.notEqual(zoomed, initial, "wheel zoom should update the content layer transform");
|
|
46
|
+
assert.notEqual(zoomed, "translate(0px, 0px) scale(1)", "wheel zoom should leave the default viewport");
|
|
47
|
+
|
|
48
|
+
await page.mouse.move(72, 132);
|
|
49
|
+
await page.mouse.down();
|
|
50
|
+
await page.mouse.move(190, 182, { steps: 4 });
|
|
51
|
+
await page.mouse.up();
|
|
52
|
+
const panned = await waitForLayerTransform(page, zoomed);
|
|
53
|
+
assert.notEqual(panned, zoomed, "blank drag should pan through the content layer transform");
|
|
54
|
+
|
|
55
|
+
await page.mouse.dblclick(48, 132);
|
|
56
|
+
const fitted = await waitForLayerTransform(page, panned);
|
|
57
|
+
assert.notEqual(fitted, panned, "blank double-click should fit the graph through the content layer transform");
|
|
58
|
+
|
|
59
|
+
await page.keyboard.down("Shift");
|
|
60
|
+
await page.locator(".node").nth(0).click();
|
|
61
|
+
await page.locator(".node").nth(1).click();
|
|
62
|
+
await page.keyboard.up("Shift");
|
|
63
|
+
const selectedAfterShiftClick = await page.locator(".node[aria-pressed='true']").count();
|
|
64
|
+
assert.equal(selectedAfterShiftClick, 2, "Shift-clicking two nodes should keep both nodes selected in the graph");
|
|
65
|
+
await assertOfflineSelectionPanel(page, "manual");
|
|
66
|
+
|
|
67
|
+
await page.keyboard.press("Escape");
|
|
68
|
+
await page.waitForSelector(".graph-selection-panel[data-state='closed']");
|
|
69
|
+
await expectNoPressedNodes(page, "Escape should clear Shift-click selections");
|
|
70
|
+
|
|
71
|
+
const transformBeforeReader = await layerTransform(page);
|
|
72
|
+
await page.locator(".node[data-id='A']").click();
|
|
73
|
+
await page.waitForSelector(".graph-reader[data-state='open']");
|
|
74
|
+
const pressedAfterPlainClick = await page.locator(".node[aria-pressed='true']").count();
|
|
75
|
+
assert.equal(pressedAfterPlainClick, 1, "plain node click should highlight one readable node");
|
|
76
|
+
await assertOfflineReaderMeta(page, {
|
|
77
|
+
title: "节点A",
|
|
78
|
+
typeLabel: "实体",
|
|
79
|
+
date: "2026-01-02",
|
|
80
|
+
source: "不应作为实体来源链接",
|
|
81
|
+
sourceLink: null
|
|
82
|
+
});
|
|
83
|
+
await page.keyboard.press("Escape");
|
|
84
|
+
await page.waitForSelector(".graph-reader[data-state='closed']");
|
|
85
|
+
await expectNoPressedNodes(page, "Escape should clear the reader highlight");
|
|
86
|
+
assert.equal(
|
|
87
|
+
await layerTransform(page),
|
|
88
|
+
transformBeforeReader,
|
|
89
|
+
"clearing graph interaction should not reset the viewport transform"
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
await page.locator(".node[data-id='S']").click();
|
|
93
|
+
await page.waitForSelector(".graph-reader[data-state='open']");
|
|
94
|
+
await assertOfflineReaderMeta(page, {
|
|
95
|
+
title: "节点来源S",
|
|
96
|
+
typeLabel: "来源",
|
|
97
|
+
date: "2026-01-03",
|
|
98
|
+
source: "原始文章S",
|
|
99
|
+
sourceLink: "/fake/wiki/sources/S.md"
|
|
100
|
+
});
|
|
101
|
+
await page.keyboard.press("Escape");
|
|
102
|
+
await page.waitForSelector(".graph-reader[data-state='closed']");
|
|
103
|
+
await expectNoPressedNodes(page, "Escape should clear source reader highlight");
|
|
104
|
+
|
|
105
|
+
await runSearchKeyboardChecks(page, "offline graph search should support shortcut, cycling, focus, and Escape");
|
|
106
|
+
await runLegendChecks(page, { persistReload: true, expectWorkbenchDrawer: false });
|
|
107
|
+
await runOfflinePinReloadCheck(page);
|
|
108
|
+
|
|
109
|
+
if (artifactDir) {
|
|
110
|
+
await page.screenshot({ path: path.join(artifactDir, "stage-4.5-offline-navigation.png"), fullPage: true });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const densePage = await browser.newPage({ viewport: { width: 1440, height: 960 } });
|
|
114
|
+
await densePage.goto(pathToFileURL(denseHtml).href);
|
|
115
|
+
await densePage.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
116
|
+
await densePage.waitForSelector("[data-viewport-layer='true']");
|
|
117
|
+
|
|
118
|
+
const denseInitial = await layerTransform(densePage);
|
|
119
|
+
const frameSamplePromise = densePage.evaluate(() => new Promise((resolve) => {
|
|
120
|
+
const start = performance.now();
|
|
121
|
+
let frames = 0;
|
|
122
|
+
function tick() {
|
|
123
|
+
frames += 1;
|
|
124
|
+
const elapsed = performance.now() - start;
|
|
125
|
+
if (elapsed >= 3000) {
|
|
126
|
+
resolve({ frames, durationMs: elapsed, fps: frames / (elapsed / 1000) });
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
requestAnimationFrame(tick);
|
|
130
|
+
}
|
|
131
|
+
requestAnimationFrame(tick);
|
|
132
|
+
}));
|
|
133
|
+
|
|
134
|
+
const denseRoot = densePage.locator("[data-llm-wiki-graph-root='true']");
|
|
135
|
+
const wheelStartedAt = Date.now();
|
|
136
|
+
while (Date.now() - wheelStartedAt < 3000) {
|
|
137
|
+
await denseRoot.dispatchEvent("wheel", {
|
|
138
|
+
deltaY: -180,
|
|
139
|
+
deltaMode: 0,
|
|
140
|
+
clientX: 520,
|
|
141
|
+
clientY: 420,
|
|
142
|
+
bubbles: true,
|
|
143
|
+
cancelable: true
|
|
144
|
+
});
|
|
145
|
+
await densePage.waitForTimeout(50);
|
|
146
|
+
}
|
|
147
|
+
const frameSample = await frameSamplePromise;
|
|
148
|
+
const denseZoomed = await layerTransform(densePage);
|
|
149
|
+
assert.notEqual(denseZoomed, denseInitial, "continuous dense wheel interaction should keep updating the viewport");
|
|
150
|
+
assert.ok(frameSample.fps >= 50, `dense wheel interaction should stay at or above 50fps, got ${frameSample.fps.toFixed(1)}fps`);
|
|
151
|
+
|
|
152
|
+
if (artifactDir) {
|
|
153
|
+
await densePage.screenshot({ path: path.join(artifactDir, "stage-4.5-offline-dense-wheel.png"), fullPage: true });
|
|
154
|
+
await fs.writeFile(
|
|
155
|
+
path.join(artifactDir, "stage-4.5-offline-dense-wheel.json"),
|
|
156
|
+
`${JSON.stringify({
|
|
157
|
+
viewport: "1440x960",
|
|
158
|
+
durationMs: Math.round(frameSample.durationMs),
|
|
159
|
+
frames: frameSample.frames,
|
|
160
|
+
fps: Math.round(frameSample.fps * 10) / 10,
|
|
161
|
+
transformChanged: denseZoomed !== denseInitial
|
|
162
|
+
}, null, 2)}\n`
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async function runOfflineThemeChecks(page) {
|
|
168
|
+
await page.waitForFunction(() => document.querySelector(".llm-wiki-graph-engine")?.dataset.theme === "shan-shui");
|
|
169
|
+
await page.getByRole("button", { name: "切换墨夜主题" }).click();
|
|
170
|
+
await page.waitForFunction(() => document.querySelector(".llm-wiki-graph-engine")?.dataset.theme === "mo-ye");
|
|
171
|
+
await page.getByRole("button", { name: "切换山水主题" }).click();
|
|
172
|
+
await page.waitForFunction(() => document.querySelector(".llm-wiki-graph-engine")?.dataset.theme === "shan-shui");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function layerTransform(page) {
|
|
176
|
+
return page.locator("[data-viewport-layer='true']").evaluate((element) => element.style.transform);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function waitForLayerTransform(page, previous) {
|
|
180
|
+
const selector = "[data-viewport-layer='true']";
|
|
181
|
+
await page.waitForFunction(
|
|
182
|
+
({ selector, previous }) => {
|
|
183
|
+
const element = document.querySelector(selector);
|
|
184
|
+
return Boolean(element && element.style.transform && element.style.transform !== previous);
|
|
185
|
+
},
|
|
186
|
+
{ selector, previous },
|
|
187
|
+
{ timeout: 3000 }
|
|
188
|
+
);
|
|
189
|
+
return layerTransform(page);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function expectNoPressedNodes(page, message) {
|
|
193
|
+
const pressed = await page.locator(".node[aria-pressed='true']").count();
|
|
194
|
+
assert.equal(pressed, 0, message);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async function assertOfflineReaderMeta(page, expected) {
|
|
198
|
+
const reader = page.locator(".graph-reader[data-state='open']");
|
|
199
|
+
await reader.locator(".graph-reader-title", { hasText: expected.title }).waitFor();
|
|
200
|
+
const meta = reader.locator(".graph-reader-meta");
|
|
201
|
+
const metaItems = await meta.locator("span").allInnerTexts();
|
|
202
|
+
assert.ok(metaItems.includes(expected.typeLabel), `offline reader meta should include type ${expected.typeLabel}`);
|
|
203
|
+
assert.ok(metaItems.includes(expected.date), `offline reader meta should include date ${expected.date}`);
|
|
204
|
+
assert.ok(metaItems.includes(expected.source), `offline reader meta should include source ${expected.source}`);
|
|
205
|
+
if (expected.sourceLink) {
|
|
206
|
+
const sourceLink = reader.locator(".graph-reader-source");
|
|
207
|
+
await sourceLink.waitFor();
|
|
208
|
+
assert.equal(await sourceLink.innerText(), expected.sourceLink, "source pages should expose their source path as a reader link");
|
|
209
|
+
} else {
|
|
210
|
+
assert.equal(await reader.locator(".graph-reader-source").count(), 0, "non-source pages should not expose source path reader links");
|
|
211
|
+
}
|
|
212
|
+
await assertNoOfflineAskActions(reader);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async function runOfflinePinReloadCheck(page) {
|
|
216
|
+
await page.evaluate(() => {
|
|
217
|
+
const key = window.__LLM_WIKI_GRAPH_PINS_KEY__;
|
|
218
|
+
if (!key) throw new Error("offline graph pins key should be published");
|
|
219
|
+
window.localStorage.setItem(key, JSON.stringify({ "/fake/wiki/entities/A.md": { x: 333, y: 222 } }));
|
|
220
|
+
});
|
|
221
|
+
await page.reload();
|
|
222
|
+
await page.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
223
|
+
await page.waitForSelector(".node[data-id='A'][data-pinned='true']");
|
|
224
|
+
const pinnedCount = await page.locator("[data-llm-wiki-graph-root='true']").evaluate((element) => element.dataset.pinnedCount);
|
|
225
|
+
assert.equal(pinnedCount, "1", "offline localStorage pins should survive reload");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async function runSearchKeyboardChecks(page, message) {
|
|
229
|
+
const root = page.locator("[data-llm-wiki-graph-root='true']");
|
|
230
|
+
await root.click({ position: { x: 24, y: 24 } });
|
|
231
|
+
await root.evaluate((element) => element.focus({ preventScroll: true }));
|
|
232
|
+
await page.keyboard.press(searchShortcut());
|
|
233
|
+
await waitForSearchState(page, "open");
|
|
234
|
+
|
|
235
|
+
const input = page.locator(".graph-search-input");
|
|
236
|
+
await input.fill("节点");
|
|
237
|
+
await page.waitForSelector('.node[data-search-state="match"]');
|
|
238
|
+
const matches = await page.locator('.node[data-search-state="match"]').count();
|
|
239
|
+
assert.ok(matches >= 2, `${message}: query should match multiple nodes`);
|
|
240
|
+
assert.equal(
|
|
241
|
+
await page.locator('.node[data-search-state="faded"]').count(),
|
|
242
|
+
0,
|
|
243
|
+
`${message}: broad query should not fade matching fixture nodes`
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
const beforeFocus = await layerTransform(page);
|
|
247
|
+
await input.press("Enter");
|
|
248
|
+
await page.waitForSelector('.node[data-search-focus="true"]');
|
|
249
|
+
const firstFocus = await focusedSearchNodeId(page);
|
|
250
|
+
await input.press("Enter");
|
|
251
|
+
await page.waitForFunction((previous) => {
|
|
252
|
+
const focused = document.querySelector('.node[data-search-focus="true"]');
|
|
253
|
+
return Boolean(focused && focused.dataset.id && focused.dataset.id !== previous);
|
|
254
|
+
}, firstFocus);
|
|
255
|
+
const secondFocus = await focusedSearchNodeId(page);
|
|
256
|
+
assert.notEqual(secondFocus, firstFocus, `${message}: Enter should cycle to another result`);
|
|
257
|
+
assert.notEqual(
|
|
258
|
+
await waitForLayerTransform(page, beforeFocus),
|
|
259
|
+
beforeFocus,
|
|
260
|
+
`${message}: Enter should move the viewport to the focused result`
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
await input.press("Escape");
|
|
264
|
+
await waitForSearchState(page, "closed");
|
|
265
|
+
assert.equal(
|
|
266
|
+
await page.locator('.node[data-search-state="match"], .node[data-search-state="faded"]').count(),
|
|
267
|
+
0,
|
|
268
|
+
`${message}: Escape should restore search visual state`
|
|
269
|
+
);
|
|
270
|
+
assert.equal(
|
|
271
|
+
await page.locator('.node[data-search-focus="true"]').count(),
|
|
272
|
+
0,
|
|
273
|
+
`${message}: Escape should clear the focused search result`
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
async function focusedSearchNodeId(page) {
|
|
278
|
+
return page.locator('.node[data-search-focus="true"]').evaluate((element) => element.dataset.id || "");
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function searchShortcut() {
|
|
282
|
+
return process.platform === "darwin" ? "Meta+F" : "Control+F";
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
async function waitForSearchState(page, state) {
|
|
286
|
+
await page.waitForFunction((state) => {
|
|
287
|
+
return document.querySelector(".graph-search")?.dataset.state === state;
|
|
288
|
+
}, state);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
async function runLegendChecks(page, options) {
|
|
292
|
+
await waitForToolbarPanel(page, "closed");
|
|
293
|
+
await openToolbarFilters(page);
|
|
294
|
+
await runTypeFilterChecks(page);
|
|
295
|
+
await runEdgeLegendChecks(page);
|
|
296
|
+
const row = page.locator(".community-legend-row").first();
|
|
297
|
+
await row.hover();
|
|
298
|
+
await page.waitForSelector('.node[data-community-state="faded"]');
|
|
299
|
+
await page.mouse.move(900, 120);
|
|
300
|
+
|
|
301
|
+
if (options.persistReload) {
|
|
302
|
+
await page.reload();
|
|
303
|
+
await page.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
304
|
+
await waitForToolbarPanel(page, "filters");
|
|
305
|
+
await closeToolbarWithBlankClick(page);
|
|
306
|
+
await waitForToolbarPanel(page, "closed");
|
|
307
|
+
await page.reload();
|
|
308
|
+
await page.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
309
|
+
await waitForToolbarPanel(page, "closed");
|
|
310
|
+
await openToolbarFilters(page);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
await page.waitForSelector(".edge");
|
|
314
|
+
const focusableCommunity = await firstCommunityWithInternalEdge(page);
|
|
315
|
+
const focusRow = page.locator(`.community-legend-row[data-community-id="${cssString(focusableCommunity)}"]`);
|
|
316
|
+
const beforeClick = await layerTransform(page);
|
|
317
|
+
const globalEdge = await page.locator(".edge").first().evaluate((edge) => ({
|
|
318
|
+
opacity: Number((edge instanceof SVGPathElement ? edge.style.opacity : "0") || "0"),
|
|
319
|
+
strokeWidth: Number((edge instanceof SVGPathElement ? edge.style.strokeWidth : "0") || "0")
|
|
320
|
+
}));
|
|
321
|
+
const initialNodes = await page.locator(".node").count();
|
|
322
|
+
await focusRow.click();
|
|
323
|
+
await waitForLayerTransform(page, beforeClick);
|
|
324
|
+
const focusedNodes = await page.locator(".node").count();
|
|
325
|
+
assert.ok(focusedNodes < initialNodes, "legend click should enter a focused community view with fewer visible nodes");
|
|
326
|
+
const focusedEdge = await page.locator(".edge").first().evaluate((edge) => ({
|
|
327
|
+
opacity: Number((edge instanceof SVGPathElement ? edge.style.opacity : "0") || "0"),
|
|
328
|
+
strokeWidth: Number((edge instanceof SVGPathElement ? edge.style.strokeWidth : "0") || "0")
|
|
329
|
+
}));
|
|
330
|
+
assert.ok(focusedEdge.opacity > globalEdge.opacity, "focused community view should make relation edges more visible");
|
|
331
|
+
assert.ok(focusedEdge.strokeWidth > globalEdge.strokeWidth, "focused community view should make relation edges fuller");
|
|
332
|
+
const selected = await page.locator(".node[aria-pressed='true']").count();
|
|
333
|
+
assert.ok(selected >= 1, "legend click should select the community nodes");
|
|
334
|
+
|
|
335
|
+
if (options.expectWorkbenchDrawer) {
|
|
336
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
337
|
+
await page.locator(".drawer-panel-open .drawer-title", { hasText: "选区" }).waitFor();
|
|
338
|
+
await page.locator(".drawer-header button").last().click();
|
|
339
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
340
|
+
assert.equal(
|
|
341
|
+
await page.locator(".node").count(),
|
|
342
|
+
focusedNodes,
|
|
343
|
+
"closing the workbench selection drawer should keep the focused community visible"
|
|
344
|
+
);
|
|
345
|
+
await expectNoPressedNodes(page, "closing the workbench selection drawer should clear highlights but not leave community focus");
|
|
346
|
+
|
|
347
|
+
await closeToolbarWithBlankClick(page);
|
|
348
|
+
await waitForToolbarPanel(page, "closed");
|
|
349
|
+
const target = await rightmostNodeSnapshot(page);
|
|
350
|
+
await page.locator(`.node[data-id="${cssString(target.id)}"]`).click();
|
|
351
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
352
|
+
await page.locator(".drawer-panel-open .drawer-title").waitFor();
|
|
353
|
+
const afterOpen = await nodeSnapshot(page, target.id);
|
|
354
|
+
const drift = Math.abs(afterOpen.centerRatioX - target.centerRatioX);
|
|
355
|
+
assert.ok(
|
|
356
|
+
drift <= 0.16,
|
|
357
|
+
`opening the workbench reader drawer should keep the clicked node visually anchored; drift=${drift.toFixed(3)}`
|
|
358
|
+
);
|
|
359
|
+
assert.ok(
|
|
360
|
+
afterOpen.centerRatioX >= 0.18 && afterOpen.centerRatioX <= 0.78,
|
|
361
|
+
`clicked node should remain in a comfortable visible band after drawer opens; ratio=${afterOpen.centerRatioX.toFixed(3)}`
|
|
362
|
+
);
|
|
363
|
+
await page.keyboard.press("Escape");
|
|
364
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
365
|
+
} else {
|
|
366
|
+
await assertOfflineSelectionPanel(page, "community");
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
async function firstCommunityWithInternalEdge(page) {
|
|
371
|
+
const communityId = await page.evaluate(() => {
|
|
372
|
+
const nodeCommunity = new Map();
|
|
373
|
+
for (const node of document.querySelectorAll(".node")) {
|
|
374
|
+
nodeCommunity.set(node.getAttribute("data-id"), node.getAttribute("data-community"));
|
|
375
|
+
}
|
|
376
|
+
for (const edge of document.querySelectorAll(".edge")) {
|
|
377
|
+
const from = edge.getAttribute("data-from");
|
|
378
|
+
const to = edge.getAttribute("data-to");
|
|
379
|
+
const fromCommunity = nodeCommunity.get(from);
|
|
380
|
+
if (fromCommunity && fromCommunity === nodeCommunity.get(to)) return fromCommunity;
|
|
381
|
+
}
|
|
382
|
+
return "";
|
|
383
|
+
});
|
|
384
|
+
assert.notEqual(communityId, "", "fixture should include a community with at least one internal relation edge");
|
|
385
|
+
return communityId;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
async function runEdgeLegendChecks(page) {
|
|
389
|
+
await page.getByRole("button", { name: "图例" }).click();
|
|
390
|
+
await waitForToolbarPanel(page, "legend");
|
|
391
|
+
await page.locator(".graph-edge-legend").waitFor();
|
|
392
|
+
await page.locator(".graph-edge-legend-relation", { hasText: "矛盾" }).waitFor();
|
|
393
|
+
await page.locator(".graph-edge-legend-confidence", { hasText: "推断" }).waitFor();
|
|
394
|
+
await hoverFirstEdgeMidpoint(page);
|
|
395
|
+
await page.waitForSelector(".graph-hover-preview[data-state='open'][data-kind='edge']");
|
|
396
|
+
const preview = page.locator(".graph-hover-preview");
|
|
397
|
+
await preview.locator(".graph-hover-preview-type", { hasText: "关系" }).waitFor();
|
|
398
|
+
await preview.locator(".graph-hover-preview-title").waitFor();
|
|
399
|
+
await assertBoxInsideViewport(page, ".graph-hover-preview", "edge relation hover preview should stay inside viewport");
|
|
400
|
+
await page.getByRole("button", { name: "筛选" }).click();
|
|
401
|
+
await waitForToolbarPanel(page, "filters");
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
async function hoverFirstEdgeMidpoint(page) {
|
|
405
|
+
const point = await page.locator(".edge").first().evaluate((edge) => {
|
|
406
|
+
if (!(edge instanceof SVGPathElement)) throw new Error("edge should be an SVG path");
|
|
407
|
+
const svg = edge.ownerSVGElement;
|
|
408
|
+
if (!svg) throw new Error("edge should have an owner SVG");
|
|
409
|
+
const length = edge.getTotalLength();
|
|
410
|
+
const mid = edge.getPointAtLength(length / 2);
|
|
411
|
+
const rect = svg.getBoundingClientRect();
|
|
412
|
+
const viewBox = svg.viewBox.baseVal;
|
|
413
|
+
return {
|
|
414
|
+
x: rect.left + (mid.x - viewBox.x) / viewBox.width * rect.width,
|
|
415
|
+
y: rect.top + (mid.y - viewBox.y) / viewBox.height * rect.height
|
|
416
|
+
};
|
|
417
|
+
});
|
|
418
|
+
await page.mouse.move(point.x, point.y);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
async function runTypeFilterChecks(page) {
|
|
422
|
+
const option = page.locator(".graph-type-filter-option").first();
|
|
423
|
+
await option.waitFor();
|
|
424
|
+
const type = await option.locator("input").evaluate((input) => input.dataset.type || "");
|
|
425
|
+
assert.notEqual(type, "", "type filter option should publish its graph node type");
|
|
426
|
+
const toggle = option.locator("input");
|
|
427
|
+
const selector = `.node[data-type="${cssString(type)}"]`;
|
|
428
|
+
const initialTypeNodes = await page.locator(selector).count();
|
|
429
|
+
const initialNodes = await page.locator(".node").count();
|
|
430
|
+
await toggle.uncheck();
|
|
431
|
+
await page.waitForFunction((selector) => document.querySelectorAll(selector).length === 0, selector);
|
|
432
|
+
const filteredNodes = await page.locator(".node").count();
|
|
433
|
+
assert.ok(filteredNodes < initialNodes, "turning off a node type should reduce visible graph nodes");
|
|
434
|
+
await toggle.check();
|
|
435
|
+
await page.waitForFunction(
|
|
436
|
+
({ selector, initialTypeNodes }) => document.querySelectorAll(selector).length === initialTypeNodes,
|
|
437
|
+
{ selector, initialTypeNodes }
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function cssString(value) {
|
|
442
|
+
return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async function rightmostNodeSnapshot(page) {
|
|
446
|
+
const nodes = await page.locator(".node").evaluateAll((elements) => {
|
|
447
|
+
const root = document.querySelector("[data-llm-wiki-graph-root='true']");
|
|
448
|
+
if (!root) throw new Error("graph root should exist");
|
|
449
|
+
const rootRect = root.getBoundingClientRect();
|
|
450
|
+
return elements.map((element) => {
|
|
451
|
+
const rect = element.getBoundingClientRect();
|
|
452
|
+
return {
|
|
453
|
+
id: element.getAttribute("data-id") || "",
|
|
454
|
+
centerRatioX: (rect.left + rect.width / 2 - rootRect.left) / Math.max(1, rootRect.width),
|
|
455
|
+
centerRatioY: (rect.top + rect.height / 2 - rootRect.top) / Math.max(1, rootRect.height)
|
|
456
|
+
};
|
|
457
|
+
}).filter((item) => item.id);
|
|
458
|
+
});
|
|
459
|
+
assert.ok(nodes.length > 0, "focused community should expose at least one node");
|
|
460
|
+
return nodes.sort((a, b) => b.centerRatioX - a.centerRatioX)[0];
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
async function nodeSnapshot(page, id) {
|
|
464
|
+
return page.locator(`.node[data-id="${cssString(id)}"]`).evaluate((element) => {
|
|
465
|
+
const root = document.querySelector("[data-llm-wiki-graph-root='true']");
|
|
466
|
+
if (!root) throw new Error("graph root should exist");
|
|
467
|
+
const rootRect = root.getBoundingClientRect();
|
|
468
|
+
const rect = element.getBoundingClientRect();
|
|
469
|
+
return {
|
|
470
|
+
id: element.getAttribute("data-id") || "",
|
|
471
|
+
centerRatioX: (rect.left + rect.width / 2 - rootRect.left) / Math.max(1, rootRect.width),
|
|
472
|
+
centerRatioY: (rect.top + rect.height / 2 - rootRect.top) / Math.max(1, rootRect.height)
|
|
473
|
+
};
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
async function assertOfflineSelectionPanel(page, expectedMode) {
|
|
478
|
+
await page.waitForSelector(".graph-selection-panel[data-state='open']");
|
|
479
|
+
const panel = page.locator(".graph-selection-panel");
|
|
480
|
+
await panel.getByText("Shift+点击 增删节点").waitFor();
|
|
481
|
+
await panel.getByText("内部关联").waitFor();
|
|
482
|
+
assert.ok(await panel.locator(".graph-selection-fact").count() >= 4, "offline selection panel should show structural facts");
|
|
483
|
+
assert.equal(await panel.getByText("提问选区").count(), 0, "offline selection panel should not show ask actions");
|
|
484
|
+
await assertNoOfflineAskActions(panel);
|
|
485
|
+
if (expectedMode === "community") {
|
|
486
|
+
await panel.getByText(/社区选区/).waitFor();
|
|
487
|
+
} else {
|
|
488
|
+
await panel.getByText(/手动选区|选中页面/).waitFor();
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
async function assertNoOfflineAskActions(scope) {
|
|
493
|
+
for (const label of ["提问选区", "在对话中引用", "它和谁有关", "总结这一组", "探索潜在联系"]) {
|
|
494
|
+
assert.equal(await scope.getByText(label).count(), 0, `offline graph should not show ${label}`);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
async function openToolbarFilters(page) {
|
|
499
|
+
const state = await page.locator("[data-llm-wiki-graph-root='true']").evaluate((element) => element.dataset.toolbarPanel || "");
|
|
500
|
+
if (state !== "filters") {
|
|
501
|
+
await page.getByRole("button", { name: "筛选" }).click();
|
|
502
|
+
}
|
|
503
|
+
await waitForToolbarPanel(page, "filters");
|
|
504
|
+
await page.waitForSelector('.graph-toolbar-panel[data-state="filters"] .community-legend-row');
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
async function closeToolbarWithBlankClick(page) {
|
|
508
|
+
const root = page.locator("[data-llm-wiki-graph-root='true']");
|
|
509
|
+
const pointer = {
|
|
510
|
+
button: 0,
|
|
511
|
+
pointerId: 1,
|
|
512
|
+
clientX: 32,
|
|
513
|
+
clientY: 128,
|
|
514
|
+
bubbles: true,
|
|
515
|
+
cancelable: true
|
|
516
|
+
};
|
|
517
|
+
await root.dispatchEvent("pointerdown", {
|
|
518
|
+
...pointer,
|
|
519
|
+
buttons: 1
|
|
520
|
+
});
|
|
521
|
+
await root.dispatchEvent("pointerup", pointer);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
async function waitForToolbarPanel(page, state) {
|
|
525
|
+
await page.waitForFunction((state) => {
|
|
526
|
+
return document.querySelector(".llm-wiki-graph-engine")?.dataset.toolbarPanel === state;
|
|
527
|
+
}, state);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
async function runWorkbenchChecks(browser) {
|
|
531
|
+
assert.notEqual(workbenchUrl, "", "GRAPH_STAGE_4_5_WORKBENCH_URL must point at the workbench dev server");
|
|
532
|
+
const page = await openWorkbenchGraphPage(browser, { width: 1440, height: 960 }, "dark");
|
|
533
|
+
await runSearchKeyboardChecks(page, "workbench graph search should support shortcut, cycling, focus, and Escape");
|
|
534
|
+
await page.locator(".node[data-id='A']").click();
|
|
535
|
+
|
|
536
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
537
|
+
const drawer = page.locator(".drawer-panel-open");
|
|
538
|
+
await drawer.locator(".drawer-title", { hasText: "节点A" }).waitFor();
|
|
539
|
+
await drawer.getByText("这是节点A的正文").waitFor();
|
|
540
|
+
await drawer.getByRole("button", { name: "在对话中引用" }).waitFor();
|
|
541
|
+
await drawer.getByRole("button", { name: "它和谁有关" }).waitFor();
|
|
542
|
+
await drawer.getByRole("button", { name: "它和谁有关" }).click();
|
|
543
|
+
await drawer.locator(".drawer-title", { hasText: "选区" }).waitFor();
|
|
544
|
+
await drawer.getByText("Shift+点击 增删节点").waitFor();
|
|
545
|
+
const readerNeighborFacts = await drawer.locator(".graph-selection-fact").count();
|
|
546
|
+
assert.ok(readerNeighborFacts >= 3, "reader related action should upgrade the page to a neighbor selection");
|
|
547
|
+
await page.keyboard.press("Escape");
|
|
548
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
549
|
+
await expectNoPressedNodes(page, "Escape should clear the reader related selection");
|
|
550
|
+
|
|
551
|
+
await page.locator(".node[data-id='A']").click();
|
|
552
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
553
|
+
await drawer.locator(".drawer-title", { hasText: "节点A" }).waitFor();
|
|
554
|
+
await drawer.getByRole("button", { name: "在对话中引用" }).click();
|
|
555
|
+
await page.getByText("@[选区:节点A · 1页] 在对话中引用").waitFor();
|
|
556
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
557
|
+
await page.getByRole("button", { name: /图谱/ }).click();
|
|
558
|
+
await page.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
559
|
+
await page.locator(".node[data-id='A']").click();
|
|
560
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
561
|
+
await drawer.locator(".drawer-title", { hasText: "节点A" }).waitFor();
|
|
562
|
+
assert.equal(await drawer.getByText("学习队列").count(), 0, "graph reader should not show learning queue");
|
|
563
|
+
assert.equal(await drawer.getByText("摘要").count(), 0, "graph reader should not show a summary block");
|
|
564
|
+
assert.equal(await drawer.getByText("相邻节点").count(), 0, "graph reader should not show a neighbor section");
|
|
565
|
+
|
|
566
|
+
await drawer.getByRole("link", { name: "wiki/entities/B.md" }).click();
|
|
567
|
+
await drawer.locator(".drawer-title", { hasText: "wiki/entities/B.md" }).waitFor();
|
|
568
|
+
await drawer.getByText("这是节点B的正文").waitFor();
|
|
569
|
+
const focused = await page.locator(".node[aria-pressed='true']").count();
|
|
570
|
+
assert.equal(focused, 1, "wikilink navigation should keep one graph node highlighted");
|
|
571
|
+
assert.equal(await page.locator(".graph-selection-panel").count(), 0, "selection should not use the old floating canvas panel");
|
|
572
|
+
|
|
573
|
+
if (artifactDir) {
|
|
574
|
+
await page.screenshot({ path: path.join(artifactDir, "stage-4.5-workbench-reader.png"), fullPage: true });
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
await page.keyboard.press("Escape");
|
|
578
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
579
|
+
await expectNoPressedNodes(page, "closing the graph reader should clear the graph highlight");
|
|
580
|
+
|
|
581
|
+
await page.keyboard.down("Shift");
|
|
582
|
+
await page.locator(".node[data-id='A']").click();
|
|
583
|
+
await page.keyboard.up("Shift");
|
|
584
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
585
|
+
await drawer.locator(".drawer-title", { hasText: "选区" }).waitFor();
|
|
586
|
+
await drawer.getByText("Shift+点击 增删节点").waitFor();
|
|
587
|
+
assert.equal(await drawer.locator(".graph-selection-fact").count(), 0, "single-node selection should hide structural facts");
|
|
588
|
+
assert.equal(await drawer.getByText("探索潜在联系").count(), 0, "single-node selection should not show group exploration");
|
|
589
|
+
|
|
590
|
+
await page.keyboard.down("Shift");
|
|
591
|
+
await page.locator(".node[data-id='B']").click();
|
|
592
|
+
await page.keyboard.up("Shift");
|
|
593
|
+
await drawer.getByText("Shift+点击 增删节点").waitFor();
|
|
594
|
+
await drawer.getByText("总结这一组").waitFor();
|
|
595
|
+
assert.ok(await drawer.locator(".graph-selection-fact").count() >= 3, "multi-node selection should show structural facts");
|
|
596
|
+
|
|
597
|
+
await page.keyboard.press("Escape");
|
|
598
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
599
|
+
await expectNoPressedNodes(page, "Escape should clear the workbench selection drawer and graph highlights");
|
|
600
|
+
await runLegendChecks(page, { persistReload: false, expectWorkbenchDrawer: true });
|
|
601
|
+
await runWorkbenchThemeViewportMatrix(browser);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
async function openWorkbenchGraphPage(browser, viewport, theme) {
|
|
605
|
+
const page = await browser.newPage({ viewport });
|
|
606
|
+
await page.addInitScript(({ theme }) => {
|
|
607
|
+
window.localStorage.setItem("llm-wiki-agent-main-view", "graph");
|
|
608
|
+
window.localStorage.setItem("llm-wiki-agent-theme", theme);
|
|
609
|
+
}, { theme });
|
|
610
|
+
await page.goto(workbenchUrl);
|
|
611
|
+
await page.waitForSelector(".app-shell");
|
|
612
|
+
const kbButton = page.getByRole("button", { name: /Stage 4\.5 Workbench Test|workbench-kb/ });
|
|
613
|
+
if (await kbButton.count() && await kbButton.first().isVisible()) {
|
|
614
|
+
await kbButton.first().click();
|
|
615
|
+
}
|
|
616
|
+
const graphButton = page.getByRole("button", { name: /图谱/ });
|
|
617
|
+
if (await graphButton.count() && await graphButton.first().isVisible()) {
|
|
618
|
+
await graphButton.first().click();
|
|
619
|
+
}
|
|
620
|
+
await page.waitForSelector("[data-llm-wiki-graph-root='true']");
|
|
621
|
+
const expectedGraphTheme = theme === "dark" ? "mo-ye" : "shan-shui";
|
|
622
|
+
await page.waitForFunction((expectedGraphTheme) => {
|
|
623
|
+
return document.querySelector(".graph-screen")?.dataset.graphTheme === expectedGraphTheme
|
|
624
|
+
&& document.querySelector(".llm-wiki-graph-engine")?.dataset.theme === expectedGraphTheme;
|
|
625
|
+
}, expectedGraphTheme);
|
|
626
|
+
return page;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
async function runWorkbenchThemeViewportMatrix(browser) {
|
|
630
|
+
const cases = [
|
|
631
|
+
{ name: "desktop-light", viewport: { width: 1440, height: 960 }, theme: "light" },
|
|
632
|
+
{ name: "desktop-dark", viewport: { width: 1440, height: 960 }, theme: "dark" },
|
|
633
|
+
{ name: "tablet-light", viewport: { width: 768, height: 1024 }, theme: "light" },
|
|
634
|
+
{ name: "tablet-dark", viewport: { width: 768, height: 1024 }, theme: "dark" },
|
|
635
|
+
{ name: "mobile-light", viewport: { width: 390, height: 844 }, theme: "light" },
|
|
636
|
+
{ name: "mobile-dark", viewport: { width: 390, height: 844 }, theme: "dark" }
|
|
637
|
+
];
|
|
638
|
+
for (const item of cases) {
|
|
639
|
+
const page = await openWorkbenchGraphPage(browser, item.viewport, item.theme);
|
|
640
|
+
await runWorkbenchThemeViewportChecks(page, item);
|
|
641
|
+
await page.close();
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
async function runWorkbenchThemeViewportChecks(page, item) {
|
|
646
|
+
await runPreviewCheck(page, `${item.name} hover preview should open`);
|
|
647
|
+
await runSearchKeyboardChecks(page, `${item.name} workbench graph search should work`);
|
|
648
|
+
await openToolbarFilters(page);
|
|
649
|
+
await page.locator(".community-legend-row").first().hover();
|
|
650
|
+
await page.waitForSelector('.node[data-community-state="faded"]');
|
|
651
|
+
await page.mouse.move(80, 80);
|
|
652
|
+
await closeToolbarWithBlankClick(page);
|
|
653
|
+
await waitForToolbarPanel(page, "closed");
|
|
654
|
+
|
|
655
|
+
await page.locator(".node[data-id='A']").click();
|
|
656
|
+
|
|
657
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
658
|
+
const drawer = page.locator(".drawer-panel-open");
|
|
659
|
+
await drawer.locator(".drawer-title", { hasText: "节点A" }).waitFor();
|
|
660
|
+
await drawer.getByText("这是节点A的正文").waitFor();
|
|
661
|
+
await assertNoViewportOverflow(page, `.drawer reader ${item.name}`);
|
|
662
|
+
assert.equal(await page.locator(".graph-selection-panel").count(), 0, `${item.name} should not use the old floating canvas panel`);
|
|
663
|
+
|
|
664
|
+
if (artifactDir) {
|
|
665
|
+
await page.screenshot({ path: path.join(artifactDir, `stage-4.5-workbench-${item.name}.png`), fullPage: true });
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
await page.keyboard.press("Escape");
|
|
669
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
670
|
+
await expectNoPressedNodes(page, `${item.name} Escape should clear the graph reader highlight`);
|
|
671
|
+
|
|
672
|
+
await page.keyboard.down("Shift");
|
|
673
|
+
await page.locator(".node[data-id='A']").click();
|
|
674
|
+
await page.keyboard.up("Shift");
|
|
675
|
+
await page.waitForSelector(".drawer-panel-open");
|
|
676
|
+
await drawer.locator(".drawer-title", { hasText: "选区" }).waitFor();
|
|
677
|
+
await drawer.getByText("Shift+点击 增删节点").waitFor();
|
|
678
|
+
await assertNoViewportOverflow(page, `.drawer selection ${item.name}`);
|
|
679
|
+
|
|
680
|
+
await page.keyboard.press("Escape");
|
|
681
|
+
await page.waitForSelector(".drawer-panel-open", { state: "detached" });
|
|
682
|
+
await expectNoPressedNodes(page, `${item.name} Escape should clear the selection drawer and graph highlights`);
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
async function runPreviewCheck(page, message) {
|
|
686
|
+
const node = page.locator(".node[data-id='A']");
|
|
687
|
+
await node.hover();
|
|
688
|
+
await page.waitForSelector(".graph-hover-preview[data-state='open']");
|
|
689
|
+
const preview = page.locator(".graph-hover-preview");
|
|
690
|
+
await preview.locator(".graph-hover-preview-title").waitFor();
|
|
691
|
+
await preview.locator(".graph-hover-preview-type").waitFor();
|
|
692
|
+
await assertBoxInsideViewport(page, ".graph-hover-preview", message);
|
|
693
|
+
await page.mouse.move(20, 20);
|
|
694
|
+
await waitForPreviewState(page, "closed");
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
async function waitForPreviewState(page, state) {
|
|
698
|
+
await page.waitForFunction((state) => {
|
|
699
|
+
return document.querySelector(".graph-hover-preview")?.dataset.state === state;
|
|
700
|
+
}, state);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
async function assertNoViewportOverflow(page, label) {
|
|
704
|
+
await assertBoxInsideViewport(page, ".drawer-panel-open", label);
|
|
705
|
+
await assertBoxInsideViewport(page, "[data-llm-wiki-graph-root='true']", label);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
async function assertBoxInsideViewport(page, selector, label) {
|
|
709
|
+
const box = await page.locator(selector).boundingBox();
|
|
710
|
+
assert.ok(box, `${label}: ${selector} should have a bounding box`);
|
|
711
|
+
const viewport = page.viewportSize();
|
|
712
|
+
assert.ok(viewport, `${label}: viewport should be available`);
|
|
713
|
+
assert.ok(box.x >= -1, `${label}: ${selector} should not overflow left`);
|
|
714
|
+
assert.ok(box.y >= -1, `${label}: ${selector} should not overflow top`);
|
|
715
|
+
assert.ok(box.x + box.width <= viewport.width + 1, `${label}: ${selector} should not overflow right`);
|
|
716
|
+
assert.ok(box.y + box.height <= viewport.height + 1, `${label}: ${selector} should not overflow bottom`);
|
|
717
|
+
}
|