@research-copilot/plugin 1.1.17 → 1.1.18
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/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,1164 @@
|
|
|
1
|
+
# 阶段 3.5 设计文档:导航 UX 重构 + 多模型子代理批量消化
|
|
2
|
+
|
|
3
|
+
> 状态:**已完成** · 创建于 2026-05-27 · 验收于 2026-05-27 · 阶段 3.5 验收通过后归档不再修改
|
|
4
|
+
>
|
|
5
|
+
> 与 PRODUCT.md 的关系:PRODUCT.md §4 阶段 3.5 + §10 是**顶层意图**,本文档是**落地细则**。冲突时以 PRODUCT.md 为准;本文档外发现新决策需要先回写 PRODUCT.md。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## §0 文档用法
|
|
10
|
+
|
|
11
|
+
- **范围**:阶段 3.5 共 7 个 step 的实施细则、API 契约、新增依赖、验收命令、执行 plan、总验收剧本
|
|
12
|
+
- **给谁看**:
|
|
13
|
+
- codex(实施):按 §9 执行 plan 一次性做完 7 step,每 step 一个 commit,最后提 1 个 PR
|
|
14
|
+
- claude(总验收):按 §10 端到端验收,发现问题按 §10.8 列 issue 清单交作者决策
|
|
15
|
+
- 作者(决策):审 issue 清单决定让 codex 修还是让 claude 修
|
|
16
|
+
- **不在范围**:图谱(阶段四)、Tauri 打包(阶段五)、媒体创作 / 浏览器扩展(阶段后规划)
|
|
17
|
+
- **工作流**(沿用阶段二 / 阶段三验证有效的流程):
|
|
18
|
+
1. 作者按 §9.6 完成前置准备(pi `auth.json` 至少配两组 provider 凭证用于多模型测试)
|
|
19
|
+
2. codex 按 §9 一次性做完 7 step,提 1 个 PR(7 commit + 允许 fix-commit)
|
|
20
|
+
3. claude 按 §10 端到端验收 + 安全审计 + §10.7 对账
|
|
21
|
+
4. claude 列 issue 清单(§10.8 格式),作者决策让 codex 还是 claude 修
|
|
22
|
+
5. 全过后作者按 §11 回写 PRODUCT.md
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## §1 阶段 3.5 总览
|
|
27
|
+
|
|
28
|
+
**背景**:阶段 1-3 完成后作者实际使用 app 发现两类痛点——
|
|
29
|
+
|
|
30
|
+
1. **导航 UX 反直觉**:
|
|
31
|
+
- 侧栏强行把 KB 分成"默认"/"外部"两类,违反"KB = 项目"心智(其他工具如 Codex App / Claude Desktop 都是一栏到底)
|
|
32
|
+
- 对话列表挂在侧栏中间,没有从属于 KB 的视觉层级,看不出"这堆对话属于哪个库"
|
|
33
|
+
- "添加现有库"需要手输绝对路径,常常失败;新建库要点完整 dialog,与"拖入 Finder 文件夹"的现代 UX 完全不沾
|
|
34
|
+
- 拖入一个非 llm-wiki 目录(比如 `~/Documents/AI学习资料`),app 直接报错而不是问"要不要初始化成 wiki 并消化里面的文档"
|
|
35
|
+
|
|
36
|
+
2. **批量消化效率低**:
|
|
37
|
+
- 阶段二的消化是"一次喂一篇"——拖一个目录里有 50 个 `.md` 要消化,用户得手动一个一个发到对话框
|
|
38
|
+
- 阶段一以来一直挂着 TBD-2"多模型路由"——消化用便宜模型 / 聊天用强模型——但当时没有承载场景;阶段 3.5 的批量消化正好是承载场景
|
|
39
|
+
|
|
40
|
+
**目标**:
|
|
41
|
+
|
|
42
|
+
1. **导航统一**:侧栏只有"一栏到底"的 KB 列表,每个 KB 可展开成对话子树;增删 KB 用拖拽优先(HTML5 drag),输入框作 fallback;遇到非 wiki 目录提供"一键初始化 + 批量消化"路径
|
|
43
|
+
2. **子代理批量消化**:基于 pi SDK 的 `createAgentSession` + 多模型注册,落地"消化角色 → cheap 模型 / 聊天角色 → main 模型"双角色路由;用一个轻量的并发控制函数(30 行级别)调度 N 个子代理并行处理 N 个文件,通过 SSE 推送进度
|
|
44
|
+
|
|
45
|
+
**核心设计原则**(贯穿阶段 3.5 所有决策):
|
|
46
|
+
|
|
47
|
+
> **拖拽优先、文本兜底**:浏览器没有"原生文件夹选择器返回绝对路径"的稳定标准能力(出于沙箱限制)。阶段 3.5 先实测 macOS Finder 在当前浏览器的 `DataTransfer` 中是否携带 `file://` URL;若携带则自动填入路径,若不携带则用拖拽区给出明确诊断并让用户粘贴路径。这里的核心原则不是"一定自动填",而是"能自动就自动,不能自动也要给用户一条可靠路径"。
|
|
48
|
+
|
|
49
|
+
> **子代理框架轻量化**:omp 项目的 1600 行 `executor.ts` 是为通用子代理框架设计的(支持工作树隔离、嵌套子代理、worker 通讯协议);我们只需要"创建独立 session + 限制并发数 + 拿结果"的 30 行版本(详见 §4 step 5)。
|
|
50
|
+
|
|
51
|
+
**7 step 概览**:
|
|
52
|
+
|
|
53
|
+
| # | Step | 后端 | 前端 | 重难度 |
|
|
54
|
+
|---|---|:---:|:---:|---|
|
|
55
|
+
| 1 | 侧栏重构:统一 KB 列表 + 折叠对话子树(去 default/external 分隔)| — | ✅ | 🟢 |
|
|
56
|
+
| 2 | 拖拽 + 输入框 KB 添加:HTML5 drag 探测路径,输入框兜底 | ✅ | ✅ | 🟡 |
|
|
57
|
+
| 3 | 非 wiki 目录检测 + 初始化引导(含批量消化预扫描) | ✅ | ✅ | 🟡 |
|
|
58
|
+
| 4 | 多模型配置:config.json 新增双角色(main/digest) + 设置面板选择 | ✅ | ✅ | 🟢 |
|
|
59
|
+
| 5 | 后端子代理批量消化框架(concurrency-limit + inMemory session) | ✅ | — | 🔴 含 TBD-3.5-1 |
|
|
60
|
+
| 6 | 批量消化 UI + SSE 进度推送 | ✅ | ✅ | 🟡 |
|
|
61
|
+
| 7 | 总验收 + UX 体感打磨 | — | ✅ | 🟢 |
|
|
62
|
+
|
|
63
|
+
**总验收 5 条**(作者拍板):
|
|
64
|
+
|
|
65
|
+
1. **侧栏统一**:KB 列表"一栏到底"无 default/external 分隔;点当前 KB 名可展开/收起对话子树,点未选中 KB 会切换并展开;外部 KB 用文字 badge 而非分区
|
|
66
|
+
2. **拖拽添加**:从 Finder 拖一个文件夹到 "+ 添加现有库" dialog 的拖拽区;若浏览器暴露真实 `file://`,路径自动填入输入框;若不暴露,UI 明确提示用户粘贴路径(不立即提交,给用户最后修改机会)
|
|
67
|
+
3. **非 wiki 兜底**:拖入一个没有 `.wiki-schema.md` 的目录,弹"该目录看起来不是 wiki,是否初始化并批量消化里面的文档"对话框;选"是"→ 后台跑 init-wiki.sh + 子代理并行消化
|
|
68
|
+
4. **多模型双角色**:设置面板新增"模型分配"区,可选 main / digest 两个角色各自的 provider+model;digest 写入 `config.json` 后对新批量消化立即生效(不需要重启),main 本阶段只保存与展示,不接管主对话
|
|
69
|
+
5. **并发消化**:批量消化 10 个 `.md` 文件能看到 ≥3 个子代理同时跑(默认并发=3),SSE 实时推送每个子代理的"进行中 / 完成 / 失败"状态,全部完成后右抽屉刷新出新增的 wiki 页面
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## §2 关键技术决策
|
|
74
|
+
|
|
75
|
+
| ID | 决策 | 选定 | 拒绝项 & 拒绝原因 |
|
|
76
|
+
|---|---|---|---|
|
|
77
|
+
| F1 | 侧栏 KB 显示 | **统一列表 + 文字 badge 标外部**(KB 名右侧灰字 `(外部)`,悬停看路径) | default/external 分两区:与"KB = 项目"心智冲突,多一个无意义维度 |
|
|
78
|
+
| F2 | 对话层级 | **KB 展开/折叠对话子树**(点 KB 名展开 / 点 chevron 折叠,类似 VS Code 文件树)| 对话单独一栏:3 栏布局空间紧;对话挂在中间:看不出从属 |
|
|
79
|
+
| F3 | 文件路径输入方式 | **拖拽 + 输入框双通道**(拖 Finder 文件夹若能拿到绝对路径则自动填入;拿不到时显示诊断并让用户粘贴路径) | 仅拖拽:浏览器不保证暴露本地绝对路径;仅输入:违反"拖拽优先" |
|
|
80
|
+
| F4 | 拖拽 API 路线 | **先探针实测,再启用自动填路径**:实现一个本机 drag probe 记录 `dataTransfer.types/getData("text/uri-list")/getData("text/plain")/files/items`;若 macOS Finder 在当前浏览器确实提供 `file://`,才自动填路径;否则 dropzone 只做目录名/文件列表提示,输入框兜底 | Tauri/Electron 文件对话框:本阶段还是 web 形态,阶段五打包再说;把 `webkitGetAsEntry().fullPath` 当本机绝对路径:Entries API 的 path 是拖拽数据虚拟根路径,不等于 native path |
|
|
81
|
+
| F5 | 非 wiki 目录处理 | **预扫描 + 弹窗引导**:拖入后 server 先扫该目录看有没有 `.wiki-schema.md`,没有则前端弹"是否初始化为 wiki" | 直接拒绝:违反"拖拽优先 UX";直接强转:用户可能误拖 |
|
|
82
|
+
| F6 | 子代理实现方式 | **复用 pi SDK 的 `createAgentSession` + `SessionManager.inMemory()`**(每个子代理一个独立 session,不持久化,共享主进程的 `authStorage` / `modelRegistry`) | 抄 omp 1600 行 `executor.ts`:过度工程,我们不需要工作树隔离 / 嵌套子代理;用主 session 顺序处理:丢掉并行收益 |
|
|
83
|
+
| F7 | 子代理并发控制 | **自写 30 行 `mapWithConcurrencyLimit`**(参考 omp/parallel.ts 简化),入口只接受并发数 `1/3/5`,内部再 `clamp >= 1` 防御 | 引入 p-limit / async-pool:增加依赖;用 `Promise.all` 一把开:N 个文件 = N 个并发请求,模型 provider 会 429 |
|
|
84
|
+
| F8 | 多模型角色配置 | **`config.json` 新增 `modelRoles: { main, digest }` 字段**,每个角色 `{provider, modelId}`;缺省时回退到 pi `settings.json` 的 `defaultProvider/defaultModel` | 写入 pi `settings.json`:跨工具污染;写入环境变量:本地工具不该读环境变量做行为决策 |
|
|
85
|
+
| F9 | 进度推送 | **沿用 SSE 协议**:批量接口 `POST /api/knowledge-bases/batch-digest` 直接返回 `text/event-stream`,事件类型见 `BatchDigestEvent` | 单独开 `/api/batch-digest/events` WebSocket:与 ADR-3"用 SSE"冲突;轮询:每个子代理一秒多个事件,轮询噪音大 |
|
|
86
|
+
| F10 | 批量消化触发 UI | **复用现有的 ingestChipVisible 入口**:检测到拖入的是目录而非单文件时,chip 文案改为 "🔍 扫到 N 个文件,批量消化?",点击后弹"选模型 + 并发数"二次确认 | 新建"批量消化"按钮:discoverability 差且与拖拽流程脱节 |
|
|
87
|
+
| F11 | 失败处理 | **每个子代理独立 try/catch**:单个文件失败不影响其他文件;全部完成后汇总"成功 N / 失败 M",失败的列具体原因(模型 429 / 文件读不到 / Skill 抛错) | 全或无:用户体感差;只记日志不上报:违反"求真不猜"原则,用户得看到失败列表才能决定是否重试 |
|
|
88
|
+
| F12 | 子代理 Skill 加载 | **阶段 3.5 的本地文件批量消化是 ADR-16 的明确例外**:子代理不加载 llm-wiki Skill 的复杂分支,直接用最小 prompt 让 cheap 模型按既定 schema 输出 wiki 页面 markdown,主进程负责写文件 | 让子代理跑完整 llm-wiki Skill:cheap 模型可能跟不上 Skill 的多步指令 + 工具调用复杂度;让子代理调 Skill:增加跨 session 状态传递复杂度 |
|
|
89
|
+
| F13 | 子代理工具集 | **只开 `read`**(读取被消化的文件原文),写盘由主进程做 | 开 `write`:cheap 模型可能写错路径,主进程已知正确路径无需 cheap 模型决策 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## §3 新增依赖
|
|
94
|
+
|
|
95
|
+
### 前端
|
|
96
|
+
**零新依赖**。HTML5 拖拽用浏览器原生 API,拖拽视觉反馈用现有的 Tailwind 类。
|
|
97
|
+
|
|
98
|
+
### 后端
|
|
99
|
+
**零新依赖**。`mapWithConcurrencyLimit` 自写(30 行),`createAgentSession` / `SessionManager.inMemory()` / `ModelRegistry.find` 都是 pi SDK 已暴露的接口。
|
|
100
|
+
|
|
101
|
+
### 与 PRODUCT.md §3.2 的关系
|
|
102
|
+
阶段 3.5 继续保持**零新依赖**记录(阶段三也是零依赖)。验收通过后 PRODUCT.md §3.2 无需新增行,ADR-18 写"阶段 3.5 零新依赖"作为存档。
|
|
103
|
+
|
|
104
|
+
如果实施中发现**实在需要**新依赖(如想抄 p-limit 代替自写),按 CLAUDE.md 规则**先停下报备**,不要先 npm install。
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## §4 七个 Step 详细设计
|
|
109
|
+
|
|
110
|
+
### Step 1:侧栏重构(统一 KB 列表 + 折叠对话子树)
|
|
111
|
+
|
|
112
|
+
**目标**:把 `web/src/components/Sidebar.tsx` 现有的"defaultKbs / externalKbs 双 section + 对话独立 section"改成"单一 KB 列表 + 每个 KB 可展开/折叠出对话子树"。
|
|
113
|
+
|
|
114
|
+
**前端文件**:
|
|
115
|
+
|
|
116
|
+
- `web/src/components/Sidebar.tsx`(重写主要渲染逻辑,~260 行 → ~280 行)
|
|
117
|
+
- `web/src/lib/types.ts`(如果有就不动;本 step 不改后端,`KnowledgeBaseInfo` 字段不变)
|
|
118
|
+
|
|
119
|
+
**新 UI 结构**:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
┌─ aside ──────────────────────┐
|
|
123
|
+
│ llm-wiki-agent ↻ │ ← header(不动)
|
|
124
|
+
├──────────────────────────────┤
|
|
125
|
+
│ 📚 知识库 │ ← section title(删 hint "~/llm-wiki/",统一)
|
|
126
|
+
│ ▾ stage2-research │ ← 当前 active KB,自动展开
|
|
127
|
+
│ ▸ 第一次对话 11:30 │
|
|
128
|
+
│ ▸ 第二次对话 昨天 │
|
|
129
|
+
│ + 新对话 │
|
|
130
|
+
│ ▸ AI学习知识库 (外部) │ ← 非 active KB 默认折叠,外部库右侧 badge
|
|
131
|
+
│ ▸ stage1-test │
|
|
132
|
+
│ ▸ (失效) old-kb │ ← invalid KB 灰显,hover 显示 reason
|
|
133
|
+
├──────────────────────────────┤
|
|
134
|
+
│ + 新建知识库 │
|
|
135
|
+
│ + 添加现有库 │
|
|
136
|
+
└──────────────────────────────┘
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**交互规则**:
|
|
140
|
+
|
|
141
|
+
- 点当前 KB 名 = 展开/收起该 KB 的对话子树;点未选中 KB 名 = 选中并切换为 active,同时展开该 KB 的对话子树
|
|
142
|
+
- 点 chevron (`▸` / `▾`) = 仅展开/折叠(不切换 active)
|
|
143
|
+
- 当前 KB 允许收起但保持选中高亮;切换 active 时旧 active 自动折叠,新 active 自动展开
|
|
144
|
+
- 外部 KB 右侧加灰色 `(外部)` 文字(不再分独立 section)
|
|
145
|
+
- 失效 KB 用现有的 disabled + tooltip 模式
|
|
146
|
+
- "+ 新对话" 按钮挪到对话子树末尾(删除原来的 Section title 右侧"+ 新对话")
|
|
147
|
+
|
|
148
|
+
**实现要点**:
|
|
149
|
+
|
|
150
|
+
- 用 `useState<Set<string>>` 维护展开的 KB path 集合,当前 KB 可从集合中移除以收起对话子树
|
|
151
|
+
- `KbItem` 拆成 `KbRow`(KB 名 + chevron + badge)+ `ConversationSubtree`(仅当展开时渲染对话列表 + 新对话按钮)
|
|
152
|
+
- 保留现有的 `Tooltip`(外部库的完整路径 / 失效原因都用 tooltip 展示,避免侧栏拥挤)
|
|
153
|
+
|
|
154
|
+
**验收命令**:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# 1. 启动 dev
|
|
158
|
+
npm run dev
|
|
159
|
+
|
|
160
|
+
# 2. 打开 http://localhost:5180
|
|
161
|
+
# - 侧栏看不到"默认"/"外部"两个 section
|
|
162
|
+
# - 当前选中库点 KB 名可展开 / 收起对话子树
|
|
163
|
+
# - 点未选中库 → 切换 active + 展开子树 + 旧 active 折叠
|
|
164
|
+
# - 外部库右侧有 (外部) 灰字
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### Step 2:拖拽 + 输入框路径填充
|
|
170
|
+
|
|
171
|
+
**目标**:把 `AddExternalDialog.tsx` 改造成"拖拽区 + 输入框"的双通道;拖 Finder 文件夹时先探测能否拿到真实路径,能拿到就自动填,拿不到就明确提示用户粘贴路径。
|
|
172
|
+
|
|
173
|
+
**前端文件**:
|
|
174
|
+
|
|
175
|
+
- `web/src/components/AddExternalDialog.tsx`(改造主体)
|
|
176
|
+
|
|
177
|
+
**后端文件**:
|
|
178
|
+
|
|
179
|
+
- `server/src/index.ts`(新增 `POST /api/knowledge-bases/inspect` 端点:传一个路径,返回 `{exists, isDirectory, hasWikiSchema, fileCount?}`,给 Step 3 用)
|
|
180
|
+
|
|
181
|
+
**新 UI 结构**:
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
┌─ Dialog: 添加现有库 ─────────────────────┐
|
|
185
|
+
│ 把 Finder 里的文件夹拖到下面 │
|
|
186
|
+
│ │
|
|
187
|
+
│ ┌──────────────────────────────────┐ │
|
|
188
|
+
│ │ 📁 拖拽文件夹到这里 │ │ ← dropzone,hover/drag-over 高亮
|
|
189
|
+
│ │ 或在下方输入框粘贴路径 │ │
|
|
190
|
+
│ └──────────────────────────────────┘ │
|
|
191
|
+
│ │
|
|
192
|
+
│ ~/AI学习 │ ← Input,被拖拽自动填、也可手编辑
|
|
193
|
+
│ │
|
|
194
|
+
│ ⚠ 路径不存在 / 该目录不是 wiki ... │ ← 实时 inspect 反馈
|
|
195
|
+
│ │
|
|
196
|
+
│ [取消] [添加] │
|
|
197
|
+
└──────────────────────────────────────────┘
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**实现要点**:
|
|
201
|
+
|
|
202
|
+
- dropzone 用 `<div onDragOver onDrop>`;`e.preventDefault()` 阻止浏览器默认行为
|
|
203
|
+
- 浏览器标准的 `File` / `FileSystemEntry` **不保证**提供本机绝对路径;`webkitGetAsEntry().fullPath` 是拖拽数据虚拟根路径,不能当真实用户主目录路径
|
|
204
|
+
- Step 2 起手先加一个 dev-only 诊断输出:drop 时 `console.info` 打印 `types`、`getData("text/uri-list")`、`getData("text/plain")`、`files[].name/type/size`、`items[].kind/type`,并用一次 macOS Finder 实测结果决定是否启用自动填路径
|
|
205
|
+
- 若实测 `text/uri-list` 或 `text/plain` 含 `file://<user-home>/...`:`text/uri-list` 优先,回退 `text/plain`,正则提取 `file://` 前缀后 decodeURIComponent → 填入输入框
|
|
206
|
+
- 若实测拿不到 `file://`:dropzone 显示"浏览器没有暴露完整路径,请在下方粘贴路径",并把检测到的文件夹名作为辅助提示;**不得**伪造绝对路径或把虚拟 `fullPath` 发给后端
|
|
207
|
+
- 输入框 onChange 后 debounce 300ms 调 `POST /api/knowledge-bases/inspect`,根据返回值决定后续:
|
|
208
|
+
- 路径不存在 → 报错
|
|
209
|
+
- 是目录但有 `.wiki-schema.md` → 走现有"添加现有库"流程(沿用阶段一的 `POST /api/knowledge-bases/external`)
|
|
210
|
+
- 是目录但没 `.wiki-schema.md` → 标记 `needsInit=true` 并预扫文件数,提交时进入 Step 3 的初始化分支
|
|
211
|
+
|
|
212
|
+
**API 契约**:
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
// POST /api/knowledge-bases/inspect
|
|
216
|
+
// 请求:{ path: string }
|
|
217
|
+
// 响应(200):{
|
|
218
|
+
// exists: boolean,
|
|
219
|
+
// isDirectory: boolean,
|
|
220
|
+
// hasWikiSchema: boolean, // 看路径下有 .wiki-schema.md 否
|
|
221
|
+
// resolvedPath?: string, // 后端 realpath/resolve 后的绝对路径;不存在时可省略
|
|
222
|
+
// ingestibleFiles?: { // 仅 isDirectory=true 时返回
|
|
223
|
+
// count: number, // 可消化的文件数(递归扫 .md/.txt/.pdf 上限 500)
|
|
224
|
+
// samples: string[], // 前 5 个文件名(给用户预览)
|
|
225
|
+
// truncated: boolean // 是否超过上限
|
|
226
|
+
// }
|
|
227
|
+
// }
|
|
228
|
+
// 错误:
|
|
229
|
+
// 400 path 为空或不是字符串
|
|
230
|
+
// 403 权限不足
|
|
231
|
+
// 500 inspect 过程发生未知错误
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**实现要点**:
|
|
235
|
+
|
|
236
|
+
- 后端递归扫描时**限定深度 ≤ 5**、**文件数上限 500**,防止用户拖入 `/` 直接卡死
|
|
237
|
+
- 跳过 `node_modules` / `.git` / `.obsidian` / `.DS_Store` 等噪音
|
|
238
|
+
- 只统计 `.md` / `.txt` / `.pdf`(与阶段二的消化能力对齐)
|
|
239
|
+
- 后端接受 `~` 开头路径并展开到用户 home;macOS 上 Finder 拖一个 alias / symlink 时 `realpath` 解析后再 inspect
|
|
240
|
+
- 重复添加已登记 KB 时保持幂等:返回 ok,不重复写 config
|
|
241
|
+
|
|
242
|
+
**验收命令**:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# 1. 启动 dev
|
|
246
|
+
npm run dev
|
|
247
|
+
|
|
248
|
+
# 2. 点"+ 添加现有库"
|
|
249
|
+
# 3. 从 Finder 拖一个已有 wiki 库到 dropzone
|
|
250
|
+
# → 若本机浏览器暴露 file://,输入框自动填 ~/xxx 或真实绝对路径
|
|
251
|
+
# → 若没有暴露 file://,UI 明确提示需要手动粘贴路径,手动粘贴后继续验收
|
|
252
|
+
# → "添加"按钮可用
|
|
253
|
+
# → 添加成功,侧栏出现新库
|
|
254
|
+
# 4. 拖一个普通目录(无 .wiki-schema.md)
|
|
255
|
+
# → inspect 返回 hasWikiSchema=false 与 ingestibleFiles
|
|
256
|
+
# → UI 显示"该目录看起来不是 wiki(含 N 个可消化文件),是否初始化?"
|
|
257
|
+
# → 此时不进入 add-external,跳到 Step 3 的初始化流程("添加"按钮文案改成"初始化为 wiki")
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
### Step 3:非 wiki 目录初始化引导
|
|
263
|
+
|
|
264
|
+
**目标**:用户拖入非 wiki 目录时,提供"初始化为 wiki 并批量消化"的一键路径。
|
|
265
|
+
|
|
266
|
+
**前端文件**:
|
|
267
|
+
|
|
268
|
+
- `web/src/components/AddExternalDialog.tsx`(继续 Step 2 的逻辑:当 `needsInit=true` 时切换按钮文案 + 二次确认弹窗)
|
|
269
|
+
- `web/src/components/InitExistingDirDialog.tsx`(新增;点"初始化为 wiki"后弹出的二次确认)
|
|
270
|
+
|
|
271
|
+
**后端文件**:
|
|
272
|
+
|
|
273
|
+
- `server/src/extensions/new-wiki.ts` 或 `server/src/wiki-init.ts`(沿用阶段二的 `init-wiki.sh` spawn 逻辑,新增一个 `initWikiInPlace(path, purpose)` 函数支持就地初始化,而不是在 `~/llm-wiki/` 下新建)
|
|
274
|
+
- `server/src/index.ts`(新增 `POST /api/knowledge-bases/init-existing`,请求体 `{path, purpose, overwrite?: boolean}`;服务端优先复用 `init-wiki.sh <path> <purpose> 中文` 或等价 TypeScript 骨架)
|
|
275
|
+
|
|
276
|
+
**关键问题**:当前已安装的 `init-wiki.sh` 签名实际是 `init-wiki.sh <知识库路径> <主题> <语言>`,第一个参数可以是已有目录路径;它会 `mkdir -p` 目录结构,并写入 `.gitignore`、`.wiki-schema.md`、`index.md`、`log.md`、`wiki/overview.md`、`purpose.md`、`.wiki-cache.json`。这说明"就地初始化"可行,但**不能静默覆盖已有同名文件**。
|
|
277
|
+
|
|
278
|
+
**实施路径**(Step 3 的 codex 实现起手第一件事是先确认):
|
|
279
|
+
|
|
280
|
+
- 看 llm-wiki-skill 仓库或 `~/.claude/skills/llm-wiki-skill/scripts/init-wiki.sh` 的现有实现,确认参数与会写入的文件列表
|
|
281
|
+
- 调用前先扫描目标目录中将被写入的文件:`.gitignore`、`.wiki-schema.md`、`index.md`、`log.md`、`wiki/overview.md`、`purpose.md`、`.wiki-cache.json`
|
|
282
|
+
- 如果这些文件已存在且请求没有 `overwrite: true` → 返回 `409`,响应包含 `conflicts: string[]`,前端弹二次确认,明确告诉用户会覆盖哪些文件
|
|
283
|
+
- 若用户确认覆盖,后端先把冲突文件备份到 `.llm-wiki-agent-backup/<timestamp>/`,再调用脚本;若备份失败,初始化直接失败
|
|
284
|
+
- 如果脚本缺失或行为不匹配 → 后端用 TypeScript 模仿 `init-wiki.sh` 的最小骨架,仍然遵守同样的冲突检测与备份规则
|
|
285
|
+
|
|
286
|
+
**新 UI 结构**(InitExistingDirDialog):
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
┌─ Dialog: 初始化为 wiki ──────────────────┐
|
|
290
|
+
│ 目录:~/AI学习 │
|
|
291
|
+
│ 扫到 N 个可消化文件(.md / .txt / .pdf)│
|
|
292
|
+
│ │
|
|
293
|
+
│ 研究方向(必填,将写入 .wiki-schema.md)│
|
|
294
|
+
│ [____________________________________] │
|
|
295
|
+
│ │
|
|
296
|
+
│ ☑ 初始化后立即批量消化全部文件 │ ← 默认勾选
|
|
297
|
+
│ │
|
|
298
|
+
│ 消化角色模型:zai/glm-4.5-air ▾ │ ← 下拉选当前可用模型
|
|
299
|
+
│ 并发数:3 ▾ │ ← 1/3/5
|
|
300
|
+
│ │
|
|
301
|
+
│ [取消] [初始化并消化] │
|
|
302
|
+
└──────────────────────────────────────────┘
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**API 契约**:
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
// POST /api/knowledge-bases/init-existing
|
|
309
|
+
// 请求:{ path: string, purpose: string, overwrite?: boolean }
|
|
310
|
+
// 响应(200):{ kbPath: string, backedUpFiles?: string[] } // 初始化后 KB 的绝对路径(即传入的 path)
|
|
311
|
+
// 行为:1. 在 path 下写 .wiki-schema.md(含 purpose 字段)
|
|
312
|
+
// 2. 在 path 下写 index.md(最小骨架,含"这个库的研究方向: <purpose>")
|
|
313
|
+
// 3. 把 path 写入 config.json 的 externalKnowledgeBases[]
|
|
314
|
+
// 错误:
|
|
315
|
+
// 400 path/purpose 为空或 path 不是目录
|
|
316
|
+
// 403 权限不足
|
|
317
|
+
// 409 目标文件已存在且 overwrite 未确认,响应 { conflicts: string[] }
|
|
318
|
+
// 500 初始化脚本执行失败
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**注意**:初始化本身**不消化**——批量消化是独立动作(Step 5/6),InitExistingDirDialog 的"☑ 初始化后立即批量消化"是 UI 便利,**实际调用顺序是 init → 前端拿到 kbPath → 前端再调 `/api/knowledge-bases/batch-digest` 触发批量消化 SSE**。
|
|
322
|
+
|
|
323
|
+
**验收命令**:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# 1. 准备测试目录
|
|
327
|
+
mkdir -p /tmp/test-not-wiki && cd /tmp/test-not-wiki
|
|
328
|
+
for i in 1 2 3; do echo "# 文件 $i" > "doc-$i.md"; done
|
|
329
|
+
|
|
330
|
+
# 2. 启动 dev,点"+ 添加现有库",拖入 /tmp/test-not-wiki
|
|
331
|
+
# → dialog 切到"初始化为 wiki"模式
|
|
332
|
+
# → 显示"扫到 3 个可消化文件"
|
|
333
|
+
# → 填研究方向 "测试初始化"
|
|
334
|
+
# → 点"初始化并消化"
|
|
335
|
+
|
|
336
|
+
# 3. 验证
|
|
337
|
+
ls /tmp/test-not-wiki/.wiki-schema.md # 存在
|
|
338
|
+
cat /tmp/test-not-wiki/.wiki-schema.md # 含 purpose: 测试初始化
|
|
339
|
+
ls /tmp/test-not-wiki/index.md # 存在
|
|
340
|
+
|
|
341
|
+
# 4. 侧栏出现 "test-not-wiki (外部)",自动 active
|
|
342
|
+
# 5. 看到批量消化 chip 已激活(接 Step 6)
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
### Step 4:多模型双角色配置
|
|
348
|
+
|
|
349
|
+
**目标**:在 `~/.llm-wiki-agent/config.json` 新增 `modelRoles: { main, digest }` 字段,UI 给两个 dropdown 选 provider+model。digest 写回后对新批量消化立即生效;main 写回后只保存与展示,本阶段不接管主对话。
|
|
350
|
+
|
|
351
|
+
**后端文件**:
|
|
352
|
+
|
|
353
|
+
- `server/src/config.ts`(扩展 schema:新增 `modelRoles?: { main?: ModelRef, digest?: ModelRef }`,`ModelRef = {provider: string, modelId: string}`)
|
|
354
|
+
- `server/src/agent.ts`(新增导出 `getRoleModel(role: "main" | "digest")` 函数:先读 config.modelRoles.<role>,回退到 pi `ModelRegistry` 的可用列表中的默认;该函数被 Step 5 的子代理框架调用)
|
|
355
|
+
- `server/src/index.ts`(新增 `GET /api/models` 返回 `[{provider, modelId, hasAuth, cost?, contextWindow}]`;扩展现有 `POST /api/config` 接受新字段)
|
|
356
|
+
|
|
357
|
+
**前端文件**:
|
|
358
|
+
|
|
359
|
+
- `web/src/components/SettingsPanel.tsx`(或现有 settings 入口)新增"模型分配"区
|
|
360
|
+
- `web/src/lib/api.ts`(新增 `fetchAvailableModels()` 调 `/api/models`)
|
|
361
|
+
|
|
362
|
+
**新 UI 结构**(设置面板"模型分配"区):
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
模型分配(双角色)
|
|
366
|
+
|
|
367
|
+
聊天角色(main) ← 用于主对话、产出工作流
|
|
368
|
+
zai / glm-5.1 (默认) ▾
|
|
369
|
+
|
|
370
|
+
消化角色(digest) ← 用于批量消化子代理
|
|
371
|
+
zai / glm-4.5-air ▾
|
|
372
|
+
|
|
373
|
+
ℹ️ 留空 = 沿用 pi 默认(~/.pi/agent/settings.json)
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**dropdown 内容**:从 `/api/models` 拿配置过 auth 的模型列表(即 `ModelRegistry.getAvailable()` 等价物),按 `provider/modelId` 显示,hover tooltip 显示成本与上下文窗口。
|
|
377
|
+
|
|
378
|
+
**API 契约**:
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
// GET /api/models
|
|
382
|
+
// 响应(200):{
|
|
383
|
+
// models: Array<{
|
|
384
|
+
// provider: string,
|
|
385
|
+
// modelId: string,
|
|
386
|
+
// name: string, // 显示名
|
|
387
|
+
// reasoning: boolean,
|
|
388
|
+
// contextWindow: number,
|
|
389
|
+
// cost: { input: number, output: number }, // per million tokens
|
|
390
|
+
// hasAuth: boolean
|
|
391
|
+
// }>,
|
|
392
|
+
// currentRoles: { main?: ModelRef, digest?: ModelRef },
|
|
393
|
+
// piDefault: { provider?: string, modelId?: string } // 从 pi settings.json 读
|
|
394
|
+
// }
|
|
395
|
+
|
|
396
|
+
// POST /api/config(扩展)
|
|
397
|
+
// 请求新增字段:modelRoles?: { main?: ModelRef | null, digest?: ModelRef | null }
|
|
398
|
+
// 行为:null 表示清空该角色,回退 pi 默认
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**`config.json` 示例**:
|
|
402
|
+
|
|
403
|
+
```json
|
|
404
|
+
{
|
|
405
|
+
"lastUsedKbPath": "~/stage2-research",
|
|
406
|
+
"externalKnowledgeBases": [...],
|
|
407
|
+
"modelRoles": {
|
|
408
|
+
"main": { "provider": "zai", "modelId": "glm-5.1" },
|
|
409
|
+
"digest": { "provider": "zai", "modelId": "glm-4.5-air" }
|
|
410
|
+
},
|
|
411
|
+
"showUserGlobalSkills": false
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
**`getRoleModel(role)` 实现要点**:
|
|
416
|
+
|
|
417
|
+
```typescript
|
|
418
|
+
// server/src/agent.ts
|
|
419
|
+
import { getModel } from "@earendil-works/pi-ai";
|
|
420
|
+
|
|
421
|
+
export async function getRoleModel(role: "main" | "digest"): Promise<Model | undefined> {
|
|
422
|
+
const config = await loadConfig();
|
|
423
|
+
const ref = config.modelRoles?.[role];
|
|
424
|
+
if (ref) {
|
|
425
|
+
const model = modelRegistry.find(ref.provider, ref.modelId);
|
|
426
|
+
if (model && modelRegistry.hasConfiguredAuth(model)) return model;
|
|
427
|
+
console.warn(`[agent] role=${role} model ${ref.provider}/${ref.modelId} 不可用,回退`);
|
|
428
|
+
}
|
|
429
|
+
// 回退 pi 默认
|
|
430
|
+
return undefined; // 让 createAgentSession 自己用 pi 默认逻辑
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
**注意**:主对话(即现有 `selectKb` / `selectConversation` 创建的 session)**当前不强制使用 main 角色**——保持现状由 pi 默认决策;只有子代理消化路径**强制使用 digest 角色**。设置面板可以展示 main,但文案必须明确:"聊天角色暂随 pi 默认,阶段 3.5 不接管主对话"。这是为了:
|
|
435
|
+
|
|
436
|
+
- 避免改动主对话路径降低稳定性
|
|
437
|
+
- 让用户的现有 pi `defaultModel` 设置仍然生效
|
|
438
|
+
- digest 角色是新功能,强制走子代理才能保证"消化用便宜模型"的承诺
|
|
439
|
+
|
|
440
|
+
如果阶段 3.5 后用户反馈"配了 main 但主对话没生效",再进入 TBD-3.5-3,把现有 session 创建路径改为读取 main。
|
|
441
|
+
|
|
442
|
+
**验收命令**:
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
# 1. 启动 dev,打开设置面板"模型分配"区
|
|
446
|
+
# 2. main 选 zai/glm-5.1, digest 选 zai/glm-4.5-air
|
|
447
|
+
# 3. 点保存
|
|
448
|
+
cat ~/.llm-wiki-agent/config.json | jq .modelRoles
|
|
449
|
+
# {"main": {"provider":"zai","modelId":"glm-5.1"}, "digest": ...}
|
|
450
|
+
|
|
451
|
+
# 4. 再打开设置面板:dropdown 显示的就是刚才的选择
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
### Step 5:后端子代理批量消化框架 🔴
|
|
457
|
+
|
|
458
|
+
**目标**:实现"一组文件 → 一组子代理并行消化 → 主进程汇总写文件"的核心后端逻辑。
|
|
459
|
+
|
|
460
|
+
**后端文件**(新增):
|
|
461
|
+
|
|
462
|
+
- `server/src/digest/concurrency.ts`(30 行级别,`mapWithConcurrencyLimit` 工具函数)
|
|
463
|
+
- `server/src/digest/subagent.ts`(单个文件 → 单个子代理 session 的逻辑)
|
|
464
|
+
- `server/src/digest/batch.ts`(编排:多文件 → 多子代理 + SSE 进度推送 + 主进程写文件)
|
|
465
|
+
|
|
466
|
+
**后端文件**(修改):
|
|
467
|
+
|
|
468
|
+
- `server/src/index.ts`(新增 `POST /api/knowledge-bases/batch-digest`,接受 `{kbPath: string, filePaths: string[], concurrency?: 1 | 3 | 5}`,返回 SSE 流;KB path 放 body,避免中文、空格、斜杠在 URL path 里二次编码)
|
|
469
|
+
|
|
470
|
+
#### `concurrency.ts`(自写并发控制)
|
|
471
|
+
|
|
472
|
+
```typescript
|
|
473
|
+
// 简化版的 omp/parallel.ts,去掉 Semaphore / signal / per-task error handling
|
|
474
|
+
// 返回值统一 { ok, value?, error? },让调用方决定怎么聚合
|
|
475
|
+
|
|
476
|
+
export interface Outcome<R> {
|
|
477
|
+
ok: boolean;
|
|
478
|
+
value?: R;
|
|
479
|
+
error?: string;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export async function mapWithConcurrencyLimit<T, R>(
|
|
483
|
+
items: T[],
|
|
484
|
+
concurrency: number,
|
|
485
|
+
fn: (item: T, index: number) => Promise<R>,
|
|
486
|
+
): Promise<Outcome<R>[]> {
|
|
487
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) {
|
|
488
|
+
throw new Error("concurrency must be a positive integer");
|
|
489
|
+
}
|
|
490
|
+
const results: Outcome<R>[] = new Array(items.length);
|
|
491
|
+
let cursor = 0;
|
|
492
|
+
|
|
493
|
+
async function worker() {
|
|
494
|
+
while (cursor < items.length) {
|
|
495
|
+
const i = cursor++;
|
|
496
|
+
try {
|
|
497
|
+
results[i] = { ok: true, value: await fn(items[i], i) };
|
|
498
|
+
} catch (err) {
|
|
499
|
+
results[i] = { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, worker));
|
|
505
|
+
return results;
|
|
506
|
+
}
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
#### `subagent.ts`(单文件单子代理)
|
|
510
|
+
|
|
511
|
+
```typescript
|
|
512
|
+
import { createAgentSession, SessionManager } from "@earendil-works/pi-coding-agent";
|
|
513
|
+
import { authStorage, modelRegistry, getRoleModel } from "../agent.js";
|
|
514
|
+
|
|
515
|
+
export interface DigestSubagentResult {
|
|
516
|
+
filePath: string;
|
|
517
|
+
wikiMarkdown: string; // 子代理输出的 wiki 页面 markdown
|
|
518
|
+
tokenUsage?: { input: number; output: number };
|
|
519
|
+
durationMs: number;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
export async function digestFileViaSubagent(
|
|
523
|
+
filePath: string,
|
|
524
|
+
kbPurpose: string, // 从 .wiki-schema.md 读
|
|
525
|
+
onProgress?: (msg: string) => void,
|
|
526
|
+
): Promise<DigestSubagentResult> {
|
|
527
|
+
const startMs = Date.now();
|
|
528
|
+
const model = await getRoleModel("digest");
|
|
529
|
+
|
|
530
|
+
const { session } = await createAgentSession({
|
|
531
|
+
model, // undefined 时 SDK 用 pi 默认
|
|
532
|
+
thinkingLevel: "off", // 消化任务不需要 thinking
|
|
533
|
+
authStorage,
|
|
534
|
+
modelRegistry,
|
|
535
|
+
sessionManager: SessionManager.inMemory(), // 不持久化
|
|
536
|
+
tools: ["read"], // 只读
|
|
537
|
+
// 不传 resourceLoader → 用 SDK 默认(不挂 KB extension / synthesis / etc.)
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
// 拼一个最小 prompt:让 cheap 模型按固定 schema 输出 wiki markdown
|
|
541
|
+
const prompt = buildDigestPrompt(filePath, kbPurpose);
|
|
542
|
+
|
|
543
|
+
let captured = "";
|
|
544
|
+
const unsub = session.subscribe((evt) => {
|
|
545
|
+
if (evt.type === "message_update" && evt.assistantMessageEvent.type === "text_delta") {
|
|
546
|
+
captured += evt.assistantMessageEvent.delta;
|
|
547
|
+
onProgress?.(`已生成 ${captured.length} 字符`);
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
try {
|
|
552
|
+
await session.prompt(prompt);
|
|
553
|
+
} finally {
|
|
554
|
+
unsub();
|
|
555
|
+
session.dispose();
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
return {
|
|
559
|
+
filePath,
|
|
560
|
+
wikiMarkdown: captured,
|
|
561
|
+
durationMs: Date.now() - startMs,
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
function buildDigestPrompt(filePath: string, kbPurpose: string): string {
|
|
566
|
+
return `你是一个 wiki 消化助手。请:
|
|
567
|
+
1. 用 read 工具读取文件 ${filePath} 的全部内容
|
|
568
|
+
2. 把内容提炼成符合 llm-wiki 风格的 wiki 页面 markdown
|
|
569
|
+
3. 输出格式:
|
|
570
|
+
- 第一行是 H1 标题(提炼自原文核心)
|
|
571
|
+
- 然后是 frontmatter(YAML,含 source/digestedAt)
|
|
572
|
+
- 然后是 ## 概述 / ## 关键点 / ## 引用片段 三个 section
|
|
573
|
+
- 末尾留空,不要解释、不要寒暄
|
|
574
|
+
|
|
575
|
+
本库的研究方向是:${kbPurpose}
|
|
576
|
+
请确保消化内容与该方向有意义的关联(无关内容也要保留事实,但摘要部分点出"与本库主线的关系")。
|
|
577
|
+
|
|
578
|
+
只输出 markdown 内容本身,不要 \`\`\`markdown 包裹。`;
|
|
579
|
+
}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
**关键设计点(解释给 codex)**:
|
|
583
|
+
|
|
584
|
+
- `SessionManager.inMemory()`:消化是一次性任务,不需要持久化对话历史
|
|
585
|
+
- `authStorage` / `modelRegistry`:从 `server/src/agent.ts` 顶层导出,子代理共享
|
|
586
|
+
- 不传 `resourceLoader`:让 SDK 用默认逻辑(不挂任何 KB / synthesis extension)→ 子代理 prompt 是"裸"的
|
|
587
|
+
- `tools: ["read"]`:子代理只能读文件,不能写盘 → 主进程负责写
|
|
588
|
+
- `thinkingLevel: "off"`:消化是结构化任务,不需要思考
|
|
589
|
+
|
|
590
|
+
#### `batch.ts`(编排)
|
|
591
|
+
|
|
592
|
+
```typescript
|
|
593
|
+
import path from "node:path";
|
|
594
|
+
import { writeFile, mkdir, readFile } from "node:fs/promises";
|
|
595
|
+
|
|
596
|
+
import { mapWithConcurrencyLimit, Outcome } from "./concurrency.js";
|
|
597
|
+
import { digestFileViaSubagent, DigestSubagentResult } from "./subagent.js";
|
|
598
|
+
|
|
599
|
+
export interface BatchDigestParams {
|
|
600
|
+
kbPath: string;
|
|
601
|
+
filePaths: string[];
|
|
602
|
+
concurrency: 1 | 3 | 5; // 默认 3;API 层拒绝其他值
|
|
603
|
+
onEvent: (event: BatchDigestEvent) => void; // SSE 推送给前端
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
export type BatchDigestEvent =
|
|
607
|
+
| { type: "start"; total: number }
|
|
608
|
+
| { type: "file_start"; index: number; filePath: string }
|
|
609
|
+
| { type: "file_progress"; index: number; message: string }
|
|
610
|
+
| { type: "file_complete"; index: number; filePath: string; wikiPath: string }
|
|
611
|
+
| { type: "file_error"; index: number; filePath: string; error: string }
|
|
612
|
+
| { type: "done"; succeeded: number; failed: number };
|
|
613
|
+
|
|
614
|
+
export async function runBatchDigest(params: BatchDigestParams): Promise<void> {
|
|
615
|
+
const { kbPath, filePaths, concurrency, onEvent } = params;
|
|
616
|
+
const kbPurpose = await readKbPurpose(kbPath);
|
|
617
|
+
const sessionsDir = path.join(kbPath, "wiki", "synthesis", "sessions");
|
|
618
|
+
await mkdir(sessionsDir, { recursive: true });
|
|
619
|
+
|
|
620
|
+
onEvent({ type: "start", total: filePaths.length });
|
|
621
|
+
|
|
622
|
+
const outcomes: Outcome<DigestSubagentResult>[] = await mapWithConcurrencyLimit(
|
|
623
|
+
filePaths,
|
|
624
|
+
concurrency,
|
|
625
|
+
async (filePath, i) => {
|
|
626
|
+
onEvent({ type: "file_start", index: i, filePath });
|
|
627
|
+
const result = await digestFileViaSubagent(filePath, kbPurpose, (msg) =>
|
|
628
|
+
onEvent({ type: "file_progress", index: i, message: msg }),
|
|
629
|
+
);
|
|
630
|
+
// 主进程写文件
|
|
631
|
+
const slug = path.basename(filePath).replace(/\.[^/.]+$/, "").replace(/[^a-z0-9-]/gi, "-");
|
|
632
|
+
const wikiPath = path.join(sessionsDir, `${slug}-${Date.now()}.md`);
|
|
633
|
+
await writeFile(wikiPath, result.wikiMarkdown, "utf8");
|
|
634
|
+
onEvent({ type: "file_complete", index: i, filePath, wikiPath });
|
|
635
|
+
return result;
|
|
636
|
+
},
|
|
637
|
+
);
|
|
638
|
+
|
|
639
|
+
const succeeded = outcomes.filter((o) => o.ok).length;
|
|
640
|
+
const failed = outcomes.length - succeeded;
|
|
641
|
+
outcomes.forEach((o, i) => {
|
|
642
|
+
if (!o.ok) onEvent({ type: "file_error", index: i, filePath: filePaths[i], error: o.error! });
|
|
643
|
+
});
|
|
644
|
+
onEvent({ type: "done", succeeded, failed });
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
async function readKbPurpose(kbPath: string): Promise<string> {
|
|
648
|
+
try {
|
|
649
|
+
const schema = await readFile(path.join(kbPath, ".wiki-schema.md"), "utf8");
|
|
650
|
+
const m = schema.match(/^purpose:\s*(.+)$/m);
|
|
651
|
+
return m?.[1]?.trim() ?? "(未设置研究方向)";
|
|
652
|
+
} catch {
|
|
653
|
+
return "(未设置研究方向)";
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
**TBD-3.5-1(关键风险,见 §8)**:
|
|
659
|
+
|
|
660
|
+
子代理 session 的 `authStorage` / `modelRegistry` 复用主进程实例 — 需要验证 pi SDK **不会**在 session dispose 时回收这些共享资源(按 SDK 文档应该不会,但需要实测)。
|
|
661
|
+
|
|
662
|
+
**API 契约**:
|
|
663
|
+
|
|
664
|
+
```typescript
|
|
665
|
+
// POST /api/knowledge-bases/batch-digest
|
|
666
|
+
// 请求:{ kbPath: string, filePaths: string[], concurrency?: 1 | 3 | 5 }
|
|
667
|
+
// 响应:Content-Type: text/event-stream
|
|
668
|
+
// 事件:BatchDigestEvent,每条 SSE event 名与 type 相同,data 为该事件 JSON
|
|
669
|
+
// 错误:
|
|
670
|
+
// 400 kbPath/filePaths 缺失、filePaths 为空、concurrency 不在 1/3/5、文件不在允许范围
|
|
671
|
+
// 403 权限不足
|
|
672
|
+
// 404 kbPath 或某个文件不存在
|
|
673
|
+
// 500 批量任务启动失败;单文件失败走 file_error,不中断整批
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
**文件路径安全规则**:
|
|
677
|
+
|
|
678
|
+
- `filePaths` 必须是绝对路径;`~` 不在此接口展开,前端应传 inspect 后的 `resolvedPath`
|
|
679
|
+
- 每个文件必须存在,扩展名只允许 `.md` / `.txt` / `.pdf`
|
|
680
|
+
- 文件必须位于 `kbPath` 下,或位于刚刚通过 inspect 扫描并由前端确认的外部目录下;不允许任意读用户磁盘上的无关路径
|
|
681
|
+
- 后端在任务开始前先做一次全量校验;不存在/越界/扩展名不允许的文件直接产生对应 `file_error`,不创建子代理
|
|
682
|
+
|
|
683
|
+
**验收命令**:
|
|
684
|
+
|
|
685
|
+
```bash
|
|
686
|
+
# 1. 单元测试 concurrency.ts
|
|
687
|
+
node --import tsx --test server/src/digest/concurrency.test.ts
|
|
688
|
+
# 测试用例:10 个 task,concurrency=3,验证最多 3 个并发
|
|
689
|
+
# 额外用例:items=[]、items.length < concurrency、concurrency=0/负数/NaN
|
|
690
|
+
|
|
691
|
+
# 2. 集成测试 subagent.ts(手工,开启 dev 后)
|
|
692
|
+
# 准备 3 个 .md 文件,调用 /api/knowledge-bases/.../batch-digest
|
|
693
|
+
# 用 curl 看 SSE 流:
|
|
694
|
+
curl -N -X POST http://localhost:8787/api/knowledge-bases/batch-digest \
|
|
695
|
+
-H 'Content-Type: application/json' \
|
|
696
|
+
-d '{"kbPath": "/tmp/test-not-wiki", "filePaths": ["/tmp/test-not-wiki/doc-1.md", "/tmp/test-not-wiki/doc-2.md", "/tmp/test-not-wiki/doc-3.md"], "concurrency": 3}'
|
|
697
|
+
|
|
698
|
+
# 期望 SSE 输出:
|
|
699
|
+
# event: start
|
|
700
|
+
# data: {"total":3}
|
|
701
|
+
# event: file_start data: {"index":0,...}
|
|
702
|
+
# event: file_start data: {"index":1,...}
|
|
703
|
+
# event: file_start data: {"index":2,...} ← 验证并发数=3 时最多同时启动 3 个
|
|
704
|
+
# event: file_complete data: {"index":0,...}
|
|
705
|
+
# event: done data: {"succeeded":3,"failed":0}
|
|
706
|
+
|
|
707
|
+
# 3. 检查输出文件
|
|
708
|
+
ls <kb-path>/wiki/synthesis/sessions/*-*.md
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
---
|
|
712
|
+
|
|
713
|
+
### Step 6:批量消化 UI + SSE 进度推送
|
|
714
|
+
|
|
715
|
+
**目标**:把 Step 5 的后端能力接入前端 UI。
|
|
716
|
+
|
|
717
|
+
**前端文件**:
|
|
718
|
+
|
|
719
|
+
- `web/src/components/ChatPanel.tsx`(修改 ingestChipVisible 逻辑:拖入目录时改文案)
|
|
720
|
+
- `web/src/components/BatchDigestPanel.tsx`(新增,进度面板)
|
|
721
|
+
- `web/src/lib/api.ts`(新增 `streamBatchDigest()` 用 EventSource 或 fetch 流读 SSE)
|
|
722
|
+
|
|
723
|
+
**新 UI 流程**:
|
|
724
|
+
|
|
725
|
+
```
|
|
726
|
+
[拖入目录到 ChatPanel] → ChatPanel 检测是目录 →
|
|
727
|
+
→ 调 /api/knowledge-bases/inspect → ingestible=N →
|
|
728
|
+
→ chip 文案: "🔍 扫到 N 个文件,批量消化?"
|
|
729
|
+
→ 点击 → 弹"选模型 + 并发数"二次确认(复用 Step 3 的 InitExistingDirDialog 的"模型 + 并发"区作 component) →
|
|
730
|
+
→ 确认后调 /api/knowledge-bases/batch-digest → BatchDigestPanel 浮窗显示
|
|
731
|
+
|
|
732
|
+
┌─ BatchDigestPanel (右下角浮窗或 Toast 集合) ─┐
|
|
733
|
+
│ 批量消化进行中 (3/10) │
|
|
734
|
+
│ │
|
|
735
|
+
│ ✅ doc-1.md → ✨ doc-1-...md │
|
|
736
|
+
│ ✅ doc-2.md → ✨ doc-2-...md │
|
|
737
|
+
│ ✅ doc-3.md → ✨ doc-3-...md │
|
|
738
|
+
│ ⏳ doc-4.md ... 已生成 234 字符 │
|
|
739
|
+
│ ⏳ doc-5.md ... 读取中 │
|
|
740
|
+
│ ⏳ doc-6.md ... 启动 │
|
|
741
|
+
│ ⌛ doc-7.md ... 排队 │
|
|
742
|
+
│ ⌛ doc-8.md ... 排队 │
|
|
743
|
+
│ │
|
|
744
|
+
│ [取消] 完成后自动关闭 │
|
|
745
|
+
└──────────────────────────────────────────────┘
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
**实现要点**:
|
|
749
|
+
|
|
750
|
+
- `BatchDigestPanel` 是全局浮窗(位置:右下角,z-index 高于普通 toast);用户切对话不影响显示
|
|
751
|
+
- 单条目状态:⌛ 排队 → ⏳ 进行中 → ✅ 成功 / ❌ 失败
|
|
752
|
+
- 完成后浮窗保留 5 秒后自动关闭(带"展示新页面"按钮跳右抽屉看产物)
|
|
753
|
+
- "取消"按钮:发 `AbortController.abort()` 到 fetch,后端检测 abort signal 后停止派发新的 task(已在跑的 subagent 不强制 kill,让它跑完——避免半成品文件)
|
|
754
|
+
|
|
755
|
+
**API 行为细节**:
|
|
756
|
+
|
|
757
|
+
- `POST /api/knowledge-bases/batch-digest` 返回 `Content-Type: text/event-stream`,SSE 事件顺序与 `BatchDigestEvent` 定义一致;`kbPath` 放 JSON body
|
|
758
|
+
- 前端用 `fetch` + `ReadableStream`(而不是 `EventSource`)以便支持 POST + abort
|
|
759
|
+
- 前端只提供并发数 `1/3/5` 三档;后端也必须校验,其他值返回 400
|
|
760
|
+
|
|
761
|
+
**验收命令**:
|
|
762
|
+
|
|
763
|
+
```bash
|
|
764
|
+
# 1. 启动 dev
|
|
765
|
+
# 2. 准备一个有 5 个 .md 文件的目录
|
|
766
|
+
# 3. 拖目录到对话框 → chip 显示 "扫到 5 个文件,批量消化?"
|
|
767
|
+
# 4. 点击 chip → 弹"模型 + 并发数"
|
|
768
|
+
# 5. 选 zai/glm-4.5-air,并发 3,点确认
|
|
769
|
+
# 6. 右下角浮窗出现,看到 3 个 ⏳ + 2 个 ⌛
|
|
770
|
+
# 7. 完成后浮窗显示 "✅ 5/5"
|
|
771
|
+
# 8. 点"展示新页面" → 右抽屉跳到 wiki/synthesis/sessions/ 列出 5 个新文件
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
---
|
|
775
|
+
|
|
776
|
+
### Step 7:总验收 + UX 体感打磨
|
|
777
|
+
|
|
778
|
+
**目标**:跑 §10 的总验收剧本,发现的小问题在这一 step 收口;不引入新功能。
|
|
779
|
+
|
|
780
|
+
**预期打磨项**(codex 边验收边记录到 commit 描述):
|
|
781
|
+
|
|
782
|
+
- 拖拽 dropzone 的视觉反馈(hover/drag-over 高亮颜色)
|
|
783
|
+
- BatchDigestPanel 的滚动条样式(条目超过 8 个时)
|
|
784
|
+
- 失败重试按钮(每条失败的右侧加 "↻ 重试",单独跑该文件)
|
|
785
|
+
- 侧栏 KB 折叠状态的 localStorage 持久化(刷新页面记得上次折叠了哪几个)
|
|
786
|
+
- 在 BatchDigestPanel 浮窗里点单条 "✅" 直接打开右抽屉看该页面
|
|
787
|
+
|
|
788
|
+
**验收命令**:
|
|
789
|
+
|
|
790
|
+
```bash
|
|
791
|
+
# 跑 §10 的完整剧本
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
---
|
|
795
|
+
|
|
796
|
+
## §5 数据契约
|
|
797
|
+
|
|
798
|
+
### 5.1 config.json 扩展
|
|
799
|
+
|
|
800
|
+
```typescript
|
|
801
|
+
interface AppConfig {
|
|
802
|
+
// 原有字段
|
|
803
|
+
lastUsedKbPath?: string;
|
|
804
|
+
externalKnowledgeBases?: Array<{ path: string; addedAt: string }>;
|
|
805
|
+
showUserGlobalSkills?: boolean;
|
|
806
|
+
|
|
807
|
+
// 阶段 3.5 新增
|
|
808
|
+
modelRoles?: {
|
|
809
|
+
main?: { provider: string; modelId: string } | null;
|
|
810
|
+
digest?: { provider: string; modelId: string } | null;
|
|
811
|
+
};
|
|
812
|
+
|
|
813
|
+
uiPrefs?: {
|
|
814
|
+
sidebarExpandedKbs?: string[]; // KB path 列表,控制折叠状态持久化(Step 7)
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
向后兼容:所有新字段都是 optional;缺省时回退 pi 默认 / 全部 KB 默认折叠(active 例外)。
|
|
820
|
+
|
|
821
|
+
### 5.2 SSE 事件协议(批量消化)
|
|
822
|
+
|
|
823
|
+
详见 §4 Step 5 的 `BatchDigestEvent` 类型定义。事件名(`type` 字段)固定 6 种,前端按 `type` switch。
|
|
824
|
+
|
|
825
|
+
### 5.3 inspect 端点响应
|
|
826
|
+
|
|
827
|
+
详见 §4 Step 2 的 API 契约。
|
|
828
|
+
|
|
829
|
+
---
|
|
830
|
+
|
|
831
|
+
## §6 验收清单
|
|
832
|
+
|
|
833
|
+
| # | 验收项 | 命令/操作 | 期望结果 |
|
|
834
|
+
|---|---|---|---|
|
|
835
|
+
| 1 | 侧栏统一 | 看侧栏 | 无 default/external 分区,外部库右侧 `(外部)` 文字 |
|
|
836
|
+
| 2 | 对话子树折叠 | 点 KB chevron | 展开/折叠对话列表 |
|
|
837
|
+
| 3 | 拖拽填路径 | 从 Finder 拖文件夹到 dropzone | 输入框自动填绝对路径 |
|
|
838
|
+
| 4 | inspect 非 wiki 目录 | 拖普通目录 | dialog 切到"初始化为 wiki"模式 |
|
|
839
|
+
| 5 | 就地初始化 | 填 purpose 点初始化 | 目录下出现 `.wiki-schema.md` + `index.md`,侧栏出现该库 |
|
|
840
|
+
| 6 | 多模型保存 | 设置面板选 main/digest | `config.json` 出现 `modelRoles` |
|
|
841
|
+
| 7 | 多模型生效 | 触发批量消化 | 后端日志显示 `[agent] role=digest model=zai/glm-4.5-air` |
|
|
842
|
+
| 8 | 并发消化 | 5 个文件并发=3 | SSE 流显示同时启动 ≤3 个 file_start |
|
|
843
|
+
| 9 | 单文件失败不影响其他 | 准备一个不存在的路径混进 filePaths | done 事件 succeeded=4 failed=1 |
|
|
844
|
+
| 10 | 完成后产物可见 | 右抽屉看 wiki/synthesis/sessions/ | 5 个新 markdown 文件 |
|
|
845
|
+
|
|
846
|
+
---
|
|
847
|
+
|
|
848
|
+
## §7 给 codex 的交接说明
|
|
849
|
+
|
|
850
|
+
### 7.1 起手第一步:阅读以下文件
|
|
851
|
+
|
|
852
|
+
1. **PRODUCT.md** §4 阶段 3.5 + §10 进度追踪(顶层意图)
|
|
853
|
+
2. **本文档**(细则)
|
|
854
|
+
3. `server/src/agent.ts`(理解现有 session 创建逻辑)
|
|
855
|
+
4. `web/src/components/Sidebar.tsx`(理解现有侧栏)
|
|
856
|
+
5. `web/src/components/AddExternalDialog.tsx`(理解现有 add-external 流程)
|
|
857
|
+
6. `server/src/extensions/new-wiki.ts`(理解现有 init-wiki 流程)
|
|
858
|
+
|
|
859
|
+
### 7.2 与 PRODUCT.md 关系
|
|
860
|
+
|
|
861
|
+
- 本阶段所有架构决策已写入 PRODUCT.md ADR-18(合并多模型双角色 + 子代理框架)
|
|
862
|
+
- 实施中若发现与 ADR-18 / 本文档冲突的事实(如 pi SDK 的 `inMemory` 行为与我预期不符),**停下报备**,不要自己改方向
|
|
863
|
+
|
|
864
|
+
### 7.3 不要做的事
|
|
865
|
+
|
|
866
|
+
- ❌ **不要** 抄 omp 的 `executor.ts` / `index.ts` 那 3000 行代码(我们只要 30 行 concurrency.ts)
|
|
867
|
+
- ❌ **不要** 在子代理 session 里挂 KB / synthesis / artifacts extension(消化是裸 prompt,子代理只读不写)
|
|
868
|
+
- ❌ **不要** 把 `main` 角色配置硬编码到主对话路径(保持当前 pi 默认逻辑兜底,避免破坏现有稳定性)
|
|
869
|
+
- ❌ **不要** 在拖拽实现里假设浏览器能拿到绝对路径 — 先实测 `dataTransfer.types/getData`;只有拿到真实 `file://` 才自动填路径,否则明确提示用户粘贴路径
|
|
870
|
+
- ❌ **不要** 静默覆盖用户已有文件 — 就地初始化前必须做冲突检测,确认覆盖时必须先备份
|
|
871
|
+
- ❌ **不要** 引入 p-limit / async-pool 等并发库(自写 30 行)
|
|
872
|
+
- ❌ **不要** 引入 react-dropzone(用原生 onDragOver/onDrop)
|
|
873
|
+
|
|
874
|
+
### 7.4 重点验证(实施过程中务必跑通)
|
|
875
|
+
|
|
876
|
+
1. **TBD-3.5-1**:子代理 session 共享主进程的 `authStorage` / `modelRegistry` 是否会被回收 → 写一个小测试连开 3 个 session 看主 session 是否仍能工作
|
|
877
|
+
2. **TBD-3.5-2**:`init-wiki.sh` 就地初始化会写哪些文件 → 必须确认冲突检测/备份列表覆盖完整
|
|
878
|
+
3. **macOS Finder 拖拽 MIME 协议**:实测 Finder 拖文件夹时 `dataTransfer.types` 含什么 → 确认是否有 `text/uri-list` / `text/plain` 的 `file://`;没有则按输入框兜底验收
|
|
879
|
+
|
|
880
|
+
---
|
|
881
|
+
|
|
882
|
+
## §8 风险与待办(TBD)
|
|
883
|
+
|
|
884
|
+
### TBD-3.5-1:子代理 session 资源共享
|
|
885
|
+
|
|
886
|
+
**问题**:pi SDK 的 `createAgentSession` 接受 `authStorage` / `modelRegistry`,但文档没说子代理 dispose 时是否会影响主 session 共享的这些实例。
|
|
887
|
+
|
|
888
|
+
**应对**:
|
|
889
|
+
- **首选**:实测开 3 个并发 inMemory session 共享一个 authStorage / modelRegistry,dispose 后主 session 是否仍能 prompt
|
|
890
|
+
- **回退**:若发现共享有副作用,每个子代理 `new AuthStorage()` / `new ModelRegistry()`(成本是每个子代理重新读 `~/.pi/agent/auth.json`,单次成本 < 1ms,可接受)
|
|
891
|
+
|
|
892
|
+
**何时定**:Step 5 实施过程中第一件事就是写 60 行测试代码验证。
|
|
893
|
+
|
|
894
|
+
### TBD-3.5-2:init-wiki.sh 就地初始化
|
|
895
|
+
|
|
896
|
+
**问题**:阶段 3.5 需要把已有目录就地初始化为 wiki。当前 `init-wiki.sh` 第一个参数就是目标路径,因此可用于已有目录;真正风险是脚本会写入固定文件,可能覆盖用户已有的 `index.md` / `purpose.md` 等资料。
|
|
897
|
+
|
|
898
|
+
**应对**:
|
|
899
|
+
- **首选**:复用 `init-wiki.sh <path> <purpose> 中文`,但调用前检查 `.gitignore`、`.wiki-schema.md`、`index.md`、`log.md`、`wiki/overview.md`、`purpose.md`、`.wiki-cache.json` 是否已存在;存在则返回 409 让前端二次确认
|
|
900
|
+
- **覆盖确认后**:先备份冲突文件到 `.llm-wiki-agent-backup/<timestamp>/`,再执行初始化
|
|
901
|
+
- **回退**:后端用 TypeScript 模仿 init-wiki.sh 的最小骨架,仍然执行同样的冲突检测和备份
|
|
902
|
+
|
|
903
|
+
**何时定**:Step 3 实施起手第一件事,验收时必须覆盖“已有 index.md 不被静默覆盖”的场景。
|
|
904
|
+
|
|
905
|
+
### TBD-3.5-3:main 角色是否影响主对话
|
|
906
|
+
|
|
907
|
+
**当前决定**:main 角色配置**不**影响 `selectKb/selectConversation` 的 session 创建,保持现有 pi 默认行为。
|
|
908
|
+
|
|
909
|
+
**未来扩展**:如果用户反馈"配了 main 但主对话没生效",则把 `selectKb` 改为读 `modelRoles.main` → 传给 `createAgentSession` 的 `model` 字段。本阶段先不做。
|
|
910
|
+
|
|
911
|
+
**何时定**:阶段 3.5 验收后看用户反馈。
|
|
912
|
+
|
|
913
|
+
### TBD-3.5-4:并发数上限
|
|
914
|
+
|
|
915
|
+
**问题**:默认并发=3,用户可调;但理论上 zai 免费层有 RPM 上限(具体不明)。
|
|
916
|
+
|
|
917
|
+
**应对**:
|
|
918
|
+
- 提供 1/3/5 三档(drop-down 不允许自定义)
|
|
919
|
+
- 失败时观察 status code = 429 → SSE 推 `file_error` 带 `error: "rate limited, please reduce concurrency"`
|
|
920
|
+
- 不做自动降级(让用户决定重试 + 调小并发)
|
|
921
|
+
|
|
922
|
+
**何时定**:本阶段直接采纳,验收后看实际遇到 429 的频率。
|
|
923
|
+
|
|
924
|
+
### TBD-3.5-5:消化输出 schema 漂移
|
|
925
|
+
|
|
926
|
+
**问题**:cheap 模型不一定严格按 `# H1 + frontmatter + 三个 section` 输出,可能漏 section / 多解释。
|
|
927
|
+
|
|
928
|
+
**应对**:
|
|
929
|
+
- prompt 里反复强调"只输出 markdown 不要寒暄"
|
|
930
|
+
- 主进程拿到 `wikiMarkdown` 后**不做**强校验(万一格式漂移也不丢内容,让人工后续修)
|
|
931
|
+
- 阶段 3.5 不做"输出格式校验 + 失败重试"——那是阶段后做
|
|
932
|
+
|
|
933
|
+
**何时定**:本阶段先放过;阶段 3.5 验收时看实际命中率,写入妥协清单。
|
|
934
|
+
|
|
935
|
+
---
|
|
936
|
+
|
|
937
|
+
## §9 执行 plan(codex 工作清单)
|
|
938
|
+
|
|
939
|
+
### 9.0 起手准备(codex 第一件事)
|
|
940
|
+
|
|
941
|
+
1. 切到 `stage-3.5` 分支(已存在)
|
|
942
|
+
2. 跑 `npm run dev` 确认阶段三末态可用
|
|
943
|
+
3. 读 §7.1 的文件清单 + 本文档全文 + PRODUCT.md ADR-18
|
|
944
|
+
4. **写 TBD-3.5-1 验证脚本**(60 行 / 跑 `node --input-type=module -e ...`)确认 SDK 行为
|
|
945
|
+
5. **加一个临时 drag probe** 实测 macOS Finder 拖文件夹时 `dataTransfer.types/getData` 是否含真实 `file://`;探针结论写进 Step 2 commit message
|
|
946
|
+
6. **看 init-wiki.sh 源码**确认写入文件列表,并先实现冲突检测/备份策略
|
|
947
|
+
|
|
948
|
+
### 9.1 Step 1:侧栏重构
|
|
949
|
+
|
|
950
|
+
- 实现:§4 Step 1
|
|
951
|
+
- 验收:§4 Step 1 末尾验收命令
|
|
952
|
+
- Commit:`refactor(stage-3.5-step-1): unify sidebar with collapsible conversation subtree`
|
|
953
|
+
|
|
954
|
+
### 9.2 Step 2:拖拽 + inspect
|
|
955
|
+
|
|
956
|
+
- 实现:§4 Step 2
|
|
957
|
+
- 验收:§4 Step 2 末尾验收命令;如果当前浏览器拿不到 `file://`,必须验收“提示用户粘贴路径”的兜底流程
|
|
958
|
+
- Commit:`feat(stage-3.5-step-2): drag-to-fill path + inspect endpoint`
|
|
959
|
+
|
|
960
|
+
### 9.3 Step 3:非 wiki 目录初始化
|
|
961
|
+
|
|
962
|
+
- 实现:§4 Step 3
|
|
963
|
+
- 验收:§4 Step 3 末尾验收命令;额外准备一个已有 `index.md` 的目录,确认首次提交返回冲突提示,确认覆盖后文件被备份
|
|
964
|
+
- Commit:`feat(stage-3.5-step-3): init-existing-dir flow with purpose prompt`
|
|
965
|
+
|
|
966
|
+
### 9.4 Step 4:多模型双角色
|
|
967
|
+
|
|
968
|
+
- 实现:§4 Step 4
|
|
969
|
+
- 验收:§4 Step 4 末尾验收命令
|
|
970
|
+
- Commit:`feat(stage-3.5-step-4): dual model roles (main/digest) in config`
|
|
971
|
+
|
|
972
|
+
### 9.5 Step 5:子代理批量消化框架
|
|
973
|
+
|
|
974
|
+
- 实现:§4 Step 5(含 §8 TBD-3.5-1 验证)
|
|
975
|
+
- 验收:§4 Step 5 末尾验收命令
|
|
976
|
+
- Commit:`feat(stage-3.5-step-5): subagent batch digest framework with concurrency limit`
|
|
977
|
+
|
|
978
|
+
### 9.6 Step 6:批量消化 UI
|
|
979
|
+
|
|
980
|
+
- 实现:§4 Step 6
|
|
981
|
+
- 验收:§4 Step 6 末尾验收命令
|
|
982
|
+
- Commit:`feat(stage-3.5-step-6): batch digest panel with SSE progress`
|
|
983
|
+
|
|
984
|
+
### 9.7 Step 7:总验收
|
|
985
|
+
|
|
986
|
+
- 跑 §10 总验收剧本
|
|
987
|
+
- 把发现的小问题修在本 step 内(不跨阶段)
|
|
988
|
+
- Commit:`polish(stage-3.5-step-7): batch digest UX touches`
|
|
989
|
+
|
|
990
|
+
### 9.8 前置准备(codex 不做,作者做)
|
|
991
|
+
|
|
992
|
+
- pi `auth.json` 至少配两组 provider 凭证(zai 已有 zai+deepseek,作者无需额外配)
|
|
993
|
+
- 准备测试目录 `/tmp/test-batch-digest/` 含 5 个 `.md` 文件
|
|
994
|
+
|
|
995
|
+
### 9.9 PR
|
|
996
|
+
|
|
997
|
+
- 7 commit + 允许 fix-commit
|
|
998
|
+
- PR base: `main`, head: `stage-3.5`
|
|
999
|
+
- Title: `feat: stage 3.5 - navigation refactor & subagent batch digest`
|
|
1000
|
+
- Body 含 §10 的快速验收命令清单
|
|
1001
|
+
|
|
1002
|
+
---
|
|
1003
|
+
|
|
1004
|
+
## §10 总验收剧本(claude 总验收用)
|
|
1005
|
+
|
|
1006
|
+
### 10.1 前置确认
|
|
1007
|
+
|
|
1008
|
+
```bash
|
|
1009
|
+
cd ../llm-wiki-agent
|
|
1010
|
+
git status # 干净
|
|
1011
|
+
git log --oneline -8 # 看到 7 个 stage-3.5-step-* commit
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
### 10.2 启动
|
|
1015
|
+
|
|
1016
|
+
```bash
|
|
1017
|
+
npm run dev
|
|
1018
|
+
# 浏览器开 http://localhost:5180
|
|
1019
|
+
```
|
|
1020
|
+
|
|
1021
|
+
### 10.3 侧栏验收(Step 1)
|
|
1022
|
+
|
|
1023
|
+
- [ ] 侧栏看不到 "默认" / "外部" 两个 section
|
|
1024
|
+
- [ ] 外部库右侧有 `(外部)` 灰字
|
|
1025
|
+
- [ ] 当前选中库点 KB 名可展开 / 收起对话子树
|
|
1026
|
+
- [ ] 点未选中库 → 切换 active + 展开子树 + 旧 active 折叠
|
|
1027
|
+
- [ ] 点 chevron 仅折叠不切换 active
|
|
1028
|
+
|
|
1029
|
+
### 10.4 拖拽与初始化验收(Step 2 + 3)
|
|
1030
|
+
|
|
1031
|
+
```bash
|
|
1032
|
+
# 准备测试目录
|
|
1033
|
+
rm -rf /tmp/test-batch-digest
|
|
1034
|
+
mkdir -p /tmp/test-batch-digest
|
|
1035
|
+
cd /tmp/test-batch-digest
|
|
1036
|
+
for i in $(seq 1 5); do
|
|
1037
|
+
cat > "doc-$i.md" <<EOF
|
|
1038
|
+
# 测试文档 $i
|
|
1039
|
+
|
|
1040
|
+
这是一篇关于 LLM agent 框架的笔记。
|
|
1041
|
+
- pi-agent 是基于 TypeScript 的
|
|
1042
|
+
- 支持 Anthropic Skills 标准
|
|
1043
|
+
- 阶段三完成了产出能力
|
|
1044
|
+
|
|
1045
|
+
## 关键技术决策
|
|
1046
|
+
为什么选 pi-agent 而非 Vercel AI SDK?因为前者原生支持 Skill 标准。
|
|
1047
|
+
EOF
|
|
1048
|
+
done
|
|
1049
|
+
```
|
|
1050
|
+
|
|
1051
|
+
- [ ] 点 "+ 添加现有库",从 Finder 拖 `/tmp/test-batch-digest`
|
|
1052
|
+
- [ ] 若本机浏览器暴露 `file://` → 输入框自动填路径;若不暴露 → UI 明确提示粘贴路径,粘贴后继续
|
|
1053
|
+
- [ ] inspect 显示 `(看起来不是 wiki,含 5 个可消化文件)`
|
|
1054
|
+
- [ ] 按钮文案变 "初始化为 wiki"
|
|
1055
|
+
- [ ] 点击 → 弹 InitExistingDirDialog
|
|
1056
|
+
- [ ] 填 purpose "LLM agent 框架研究"
|
|
1057
|
+
- [ ] 选 digest 模型 `zai/glm-4.5-air`,并发=3
|
|
1058
|
+
- [ ] 点 "初始化并消化"
|
|
1059
|
+
- [ ] 验证:
|
|
1060
|
+
```bash
|
|
1061
|
+
cat /tmp/test-batch-digest/.wiki-schema.md # 含 purpose
|
|
1062
|
+
cat /tmp/test-batch-digest/index.md # 含 purpose
|
|
1063
|
+
ls /tmp/test-batch-digest/wiki/synthesis/sessions/ # 5 个 .md 文件
|
|
1064
|
+
```
|
|
1065
|
+
|
|
1066
|
+
冲突保护额外验收:
|
|
1067
|
+
|
|
1068
|
+
```bash
|
|
1069
|
+
rm -rf /tmp/test-init-conflict
|
|
1070
|
+
mkdir -p /tmp/test-init-conflict
|
|
1071
|
+
echo "# 用户原有索引" > /tmp/test-init-conflict/index.md
|
|
1072
|
+
```
|
|
1073
|
+
|
|
1074
|
+
- [ ] 添加 `/tmp/test-init-conflict` 并初始化时,前端显示将覆盖 `index.md`
|
|
1075
|
+
- [ ] 不确认覆盖时,`index.md` 内容不变
|
|
1076
|
+
- [ ] 确认覆盖后,旧 `index.md` 出现在 `.llm-wiki-agent-backup/<timestamp>/index.md`
|
|
1077
|
+
|
|
1078
|
+
### 10.5 多模型配置验收(Step 4)
|
|
1079
|
+
|
|
1080
|
+
```bash
|
|
1081
|
+
# 看 config.json
|
|
1082
|
+
cat ~/.llm-wiki-agent/config.json | jq .modelRoles
|
|
1083
|
+
# 期望:{"main": null, "digest": {"provider":"zai","modelId":"glm-4.5-air"}}
|
|
1084
|
+
# (main 没配是因为我们让用户自由 / 默认不动)
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
- [ ] 打开设置面板"模型分配"区,看到当前 digest = zai/glm-4.5-air
|
|
1088
|
+
- [ ] 切 digest 到 deepseek/deepseek-v4-flash 保存
|
|
1089
|
+
- [ ] 再批量消化一个文件 → 后端 log 显示 `[agent] role=digest model=deepseek/deepseek-v4-flash`
|
|
1090
|
+
|
|
1091
|
+
### 10.6 批量消化进度验收(Step 5 + 6)
|
|
1092
|
+
|
|
1093
|
+
观察 BatchDigestPanel:
|
|
1094
|
+
- [ ] 启动后 3 秒内有 3 个 ⏳(并发 3 同时启动)
|
|
1095
|
+
- [ ] 每条目状态变化:⌛ → ⏳ → ✅
|
|
1096
|
+
- [ ] file_progress 实时更新("已生成 N 字符")
|
|
1097
|
+
- [ ] 全部完成显示 "✅ 5/5"
|
|
1098
|
+
- [ ] 主动制造失败:传一个不存在的路径混进 filePaths → 期望 4 ✅ + 1 ❌,❌ 行显示错误信息
|
|
1099
|
+
- [ ] 主动传 `concurrency=0` 或 `2` → 期望接口返回 400,不启动任务
|
|
1100
|
+
|
|
1101
|
+
### 10.7 对账:实施细节 vs 设计文档
|
|
1102
|
+
|
|
1103
|
+
claude 总验收时对照本文档 §4 所有 step 与实际 commit diff,记录差异:
|
|
1104
|
+
|
|
1105
|
+
| Step | 设计意图(本文档) | 实施现状(实际 commit) | 偏差 |
|
|
1106
|
+
|---|---|---|---|
|
|
1107
|
+
| 1 | 侧栏统一 | _填写实际_ | _无 / 有偏差描述_ |
|
|
1108
|
+
| ... | ... | ... | ... |
|
|
1109
|
+
|
|
1110
|
+
### 10.8 issue 清单(claude 列出,作者决策)
|
|
1111
|
+
|
|
1112
|
+
发现的问题按以下格式列:
|
|
1113
|
+
|
|
1114
|
+
```markdown
|
|
1115
|
+
## issue-N: <一句话标题>
|
|
1116
|
+
|
|
1117
|
+
**严重度**:🔴 阻塞 / 🟡 妨碍验收 / 🟢 微妙打磨
|
|
1118
|
+
**所在 step**:Step X
|
|
1119
|
+
**现象**:...
|
|
1120
|
+
**期望**:...
|
|
1121
|
+
**建议修复路径**:...
|
|
1122
|
+
**作者决策**:[ ] codex 修 [ ] claude 修 [ ] 接受妥协写入 PRODUCT.md
|
|
1123
|
+
```
|
|
1124
|
+
|
|
1125
|
+
作者从清单选每条决策;codex 修的列回 PR;claude 修的直接提 PR 上 commit。
|
|
1126
|
+
|
|
1127
|
+
---
|
|
1128
|
+
|
|
1129
|
+
## §11 文档维护
|
|
1130
|
+
|
|
1131
|
+
- **本文档冻结时机**:阶段 3.5 验收通过、PR 合并到 main 之后,本文档**只允许加完成情况附录**(类比阶段三设计文档的"完成情况"段),不改原文
|
|
1132
|
+
- **回写 PRODUCT.md**:验收通过后,作者按 §11.1 检查清单更新 PRODUCT.md
|
|
1133
|
+
- **本文档与 PRODUCT.md 冲突**:以 PRODUCT.md 为准;本文档外发现新决策需要先回写 PRODUCT.md
|
|
1134
|
+
|
|
1135
|
+
### 11.1 验收后 PRODUCT.md 更新清单
|
|
1136
|
+
|
|
1137
|
+
- [x] §4 阶段 3.5 标题加 `✅ 已完成 2026-05-27`
|
|
1138
|
+
- [x] §4 阶段 3.5 末尾加"完成情况"小节(范围交付、接受的妥协、新增依赖)
|
|
1139
|
+
- [x] §10 进度追踪更新"阶段 3.5"章节(完成情况 + 验收实况)
|
|
1140
|
+
- [x] §7 ADR-18 保持与实现一致
|
|
1141
|
+
- [x] §9 待决事项把 TBD-2 标 ✅ 已解决(多模型路由落地)
|
|
1142
|
+
- [x] CLAUDE.md 的"项目当前阶段"段改为 "阶段 3.5 已完成",指向下一阶段(图谱 / 阶段后规划)
|
|
1143
|
+
|
|
1144
|
+
### 11.2 与阶段三设计文档的关系
|
|
1145
|
+
|
|
1146
|
+
阶段三设计文档与本文档**完全独立**:阶段三的 manifest / artifact 概念不在本阶段使用;本阶段的子代理框架不影响阶段三的产出工作流。
|
|
1147
|
+
|
|
1148
|
+
唯一交集:批量消化产生的 wiki 页面如果用户后续要"做成 PDF",走的是阶段三的产出流程,与本阶段无关。
|
|
1149
|
+
|
|
1150
|
+
### 11.3 完成情况附录
|
|
1151
|
+
|
|
1152
|
+
- 完成时间:2026-05-27
|
|
1153
|
+
- 范围:侧栏统一、拖拽/输入路径检查、非 wiki 目录就地初始化、多模型角色配置、子代理批量消化、SSE 进度浮窗
|
|
1154
|
+
- 新增依赖:无
|
|
1155
|
+
- 保留妥协:浏览器拖拽若拿不到真实路径,继续要求用户粘贴路径
|
|
1156
|
+
- 验收后修正:main 角色已接管主对话;设置切换 main 后重载当前活跃对话,让右上角模型显示与配置保持一致
|
|
1157
|
+
- 验证:`npm run --silent typecheck`、`node --import tsx --test server/src/digest/concurrency.test.ts`、本地接口实测、单文件批量消化真实跑通
|
|
1158
|
+
|
|
1159
|
+
### 11.4 验收后补强(2026-05-28)
|
|
1160
|
+
|
|
1161
|
+
- 批量消化失败隔离:单个文件缺失、类型不支持或来源校验失败时,只标记该文件失败,不中断同批其他文件。
|
|
1162
|
+
- 批量消化面板:从总进度浮窗补强为逐文件状态列表,显示排队 / 运行 / 完成 / 失败、已生成字数,并给完成项提供打开结果入口。
|
|
1163
|
+
- 外部目录来源校验:`inspect` 端点返回 `scanId`,批量消化只接受刚扫描确认过的外部文件;不再信任前端传任意 `sourceRoot`。
|
|
1164
|
+
- 初始化后批量消化:初始化非 wiki 目录时可为本次任务选择 digest 模型,不需要改全局设置。
|