minimal-agent 0.8.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -12
- package/package.json +34 -1
- package/plugins/cron-runner/.claude-plugin/plugin.json +5 -0
- package/plugins/cron-runner/commands/cron.md +26 -0
- package/plugins/cron-runner/commands/crons.md +7 -0
- package/plugins/cron-runner/plugin.js +34 -0
- package/plugins/cron-runner/src/commands.js +348 -0
- package/plugins/cron-runner/src/cronTime.js +148 -0
- package/plugins/cron-runner/src/lock.js +68 -0
- package/plugins/cron-runner/src/runs.js +89 -0
- package/plugins/cron-runner/src/scheduleEngine.js +72 -0
- package/plugins/cron-runner/src/scheduler.js +355 -0
- package/plugins/cron-runner/src/schema.js +140 -0
- package/plugins/cron-runner/src/service.js +167 -0
- package/plugins/cron-runner/src/store.js +298 -0
- package/plugins/cron-runner/src/types.js +1 -0
- package/plugins/workflow-runner/commands/workflow.md +4 -4
- package/plugins/workflow-runner/commands/workflows.md +1 -1
- package/plugins/workflow-runner/plugin.js +3 -1
- package/plugins/workflow-runner/src/agentCommon.js +249 -51
- package/plugins/workflow-runner/src/dslManifest.js +72 -0
- package/plugins/workflow-runner/src/expressions.js +198 -15
- package/plugins/workflow-runner/src/index.js +40 -8
- package/plugins/workflow-runner/src/jsonPayload.js +1 -1
- package/plugins/workflow-runner/src/loader.js +286 -72
- package/plugins/workflow-runner/src/multimodal.js +37 -0
- package/plugins/workflow-runner/src/recovery.js +49 -39
- package/plugins/workflow-runner/src/runner.js +802 -287
- package/plugins/workflow-runner/src/stepExecutors/agent.js +157 -39
- package/plugins/workflow-runner/src/stepExecutors/assert.js +16 -3
- package/plugins/workflow-runner/src/stepExecutors/llm.js +60 -111
- package/plugins/workflow-runner/src/stepExecutors/skill.js +47 -47
- package/plugins/workflow-runner/src/stepExecutors/tool.js +76 -10
- package/plugins/workflow-runner/src/stepExecutors/verify.js +27 -10
- package/plugins/workflow-runner/src/taskIdentity.js +296 -0
- package/plugins/workflow-runner/src/types.js +19 -9
- package/plugins/workflow-runner/src/workflowState.js +516 -33
- package/skills/adversarial-review/SKILL.md +0 -1
- package/skills/ai-image/SKILL.md +89 -0
- package/skills/ai-image/scripts/generate.mjs +497 -0
- package/skills/ai-image/scripts/generate_from_plan.mjs +469 -0
- package/skills/ai-image/scripts/generate_from_plan_test.mjs +223 -0
- package/skills/ai-image/scripts/generate_test.mjs +74 -0
- package/skills/browser-automation/SKILL.md +47 -0
- package/skills/docx/SKILL.md +25 -3
- package/skills/docx/scripts/office/helpers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/helpers/__pycache__/merge_runs.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/helpers/__pycache__/simplify_redlines.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/validators/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/validators/__pycache__/base.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/validators/__pycache__/docx.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/validators/__pycache__/pptx.cpython-314.pyc +0 -0
- package/skills/docx/scripts/office/validators/__pycache__/redlining.cpython-314.pyc +0 -0
- package/skills/docx/scripts/opc_check.py +253 -0
- package/skills/image-gen-openrouter/SKILL.md +10 -2
- package/skills/image-stats/SKILL.md +65 -0
- package/skills/image-stats/scripts/__pycache__/image_stats.cpython-314.pyc +0 -0
- package/skills/image-stats/scripts/__pycache__/image_stats_test.cpython-314.pyc +0 -0
- package/skills/image-stats/scripts/image_stats.py +368 -0
- package/skills/image-stats/scripts/image_stats_test.py +181 -0
- package/skills/pptx/SKILL.md +123 -95
- package/skills/pptx/design.md +82 -0
- package/skills/pptx/examples/README.md +29 -0
- package/skills/pptx/examples/hybrid_example.mjs +107 -0
- package/skills/pptx/examples/hybrid_example.pptx +0 -0
- package/skills/pptx/pptxgenjs.md +41 -0
- package/skills/pptx/scripts/deck_helpers.mjs +224 -0
- package/skills/pptx/scripts/layout_lint.py +293 -0
- package/skills/pptx/scripts/layout_lint_test.py +160 -0
- package/skills/pptx/scripts/opc_check.py +339 -0
- package/skills/pptx/scripts/svg_fallback.mjs +145 -0
- package/skills/pptx/svg.md +67 -0
- package/skills/tts-zh/SKILL.md +19 -2
- package/skills/ui-design/SKILL.md +158 -0
- package/skills/ui-design/claude_design.md +309 -0
- package/skills/ui-design/evals/evals.json +254 -0
- package/skills/ui-design/references/aesthetic-direction.md +83 -0
- package/skills/ui-design/references/claude-design-protocol.md +36 -0
- package/skills/ui-design/references/design-context.md +53 -0
- package/skills/ui-design/references/design-execution-playbook.md +82 -0
- package/skills/ui-design/references/export-pptx.md +124 -0
- package/skills/ui-design/references/layout-composition.md +654 -0
- package/skills/ui-design/references/preview-feedback.md +37 -0
- package/skills/ui-design/references/source-image-layout.md +189 -0
- package/skills/ui-design/references/starter-components.md +78 -0
- package/skills/ui-design/references/vi-aegis-vector.md +144 -0
- package/skills/ui-design/references/vi-amber-prism.md +133 -0
- package/skills/ui-design/references/vi-aqua-glass.md +200 -0
- package/skills/ui-design/references/vi-comfort-vision.md +147 -0
- package/skills/ui-design/references/vi-ember-prism.md +140 -0
- package/skills/ui-design/references/vi-nebula-console.md +151 -0
- package/skills/ui-design/references/vi-obsidian-optics.md +139 -0
- package/skills/ui-design/references/vi-obsidian-xui.md +143 -0
- package/skills/ui-design/references/vi-precision-horizon-dark.md +117 -0
- package/skills/ui-design/references/vi-precision-horizon.md +215 -0
- package/skills/ui-design/references/vi-solar-relay.md +130 -0
- package/skills/ui-design/references/vi-template-workflow.md +48 -0
- package/skills/ui-design/references/vi-verdant-grid.md +141 -0
- package/skills/ui-design/references/vi-violet-meridian.md +172 -0
- package/skills/ui-design/scripts/__pycache__/assemble_material.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/assemble_material_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/chart_sanity_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/check_language_policy.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/check_ui_artifact.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/check_ui_artifact_pptx_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/deck_pages_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/deck_pages_check_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/deck_visual_style_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/deck_visual_style_check_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/design_budget_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/design_budget_check_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/design_repair_hints.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/design_repair_hints_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/design_style_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/design_style_check_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/draft_coverage_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/extract_source_assets.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/extract_source_assets_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/generated_image_review_collect.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/generated_image_review_collect_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/image_plan_lint.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/image_plan_lint_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/image_prompt_rewrite.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/image_prompt_rewrite_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/layout_balance.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/layout_balance_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/normalize_design_json.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/normalize_design_json_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/plan_source_layout.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/plan_source_layout_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/resolve_source_hint.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/resolve_source_hint_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/resolve_source_input.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/resolve_source_input_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/scaffold_ui_artifact.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/source_usage_check.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/source_usage_check_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/text_readability_pixel.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/visual_quality_gate.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/__pycache__/visual_quality_gate_test.cpython-314.pyc +0 -0
- package/skills/ui-design/scripts/assemble_material.py +217 -0
- package/skills/ui-design/scripts/assemble_material_test.py +149 -0
- package/skills/ui-design/scripts/browser_check_ui_artifact.mjs +221 -0
- package/skills/ui-design/scripts/chart_sanity_check.py +261 -0
- package/skills/ui-design/scripts/chart_sanity_check_test.py +165 -0
- package/skills/ui-design/scripts/check_language_policy.py +351 -0
- package/skills/ui-design/scripts/check_ui_artifact.py +435 -0
- package/skills/ui-design/scripts/check_ui_artifact_pptx_test.py +251 -0
- package/skills/ui-design/scripts/deck_pages_check.py +158 -0
- package/skills/ui-design/scripts/deck_pages_check_test.py +134 -0
- package/skills/ui-design/scripts/deck_visual_style_check.py +767 -0
- package/skills/ui-design/scripts/deck_visual_style_check_test.py +713 -0
- package/skills/ui-design/scripts/design_budget_check.py +271 -0
- package/skills/ui-design/scripts/design_budget_check_test.py +183 -0
- package/skills/ui-design/scripts/design_repair_hints.py +162 -0
- package/skills/ui-design/scripts/design_repair_hints_test.py +54 -0
- package/skills/ui-design/scripts/design_style_check.py +397 -0
- package/skills/ui-design/scripts/design_style_check_test.py +233 -0
- package/skills/ui-design/scripts/draft_coverage_check.py +184 -0
- package/skills/ui-design/scripts/draft_coverage_check_test.py +131 -0
- package/skills/ui-design/scripts/export_pptx_from_html.mjs +2367 -0
- package/skills/ui-design/scripts/extract_source_assets.py +607 -0
- package/skills/ui-design/scripts/extract_source_assets_test.py +256 -0
- package/skills/ui-design/scripts/generated_image_review_collect.py +206 -0
- package/skills/ui-design/scripts/generated_image_review_collect_test.py +91 -0
- package/skills/ui-design/scripts/image_plan_lint.py +571 -0
- package/skills/ui-design/scripts/image_plan_lint_test.py +515 -0
- package/skills/ui-design/scripts/image_prompt_rewrite.py +713 -0
- package/skills/ui-design/scripts/image_prompt_rewrite_test.py +966 -0
- package/skills/ui-design/scripts/layout_balance.py +881 -0
- package/skills/ui-design/scripts/layout_balance_test.py +927 -0
- package/skills/ui-design/scripts/normalize_design_json.py +272 -0
- package/skills/ui-design/scripts/normalize_design_json_test.py +119 -0
- package/skills/ui-design/scripts/plan_source_layout.py +1450 -0
- package/skills/ui-design/scripts/plan_source_layout_test.py +1136 -0
- package/skills/ui-design/scripts/resolve_source_input.py +270 -0
- package/skills/ui-design/scripts/resolve_source_input_test.py +98 -0
- package/skills/ui-design/scripts/scaffold_ui_artifact.py +377 -0
- package/skills/ui-design/scripts/source_usage_check.py +581 -0
- package/skills/ui-design/scripts/source_usage_check_test.py +427 -0
- package/skills/ui-design/scripts/text_readability_pixel.py +340 -0
- package/skills/ui-design/scripts/text_readability_pixel_test.py +219 -0
- package/skills/ui-design/scripts/visual_quality_gate.py +301 -0
- package/skills/ui-design/scripts/visual_quality_gate_test.py +233 -0
- package/skills/ui-design/tests/e2e/prompts/deck.md +19 -0
- package/skills/ui-design/tests/e2e/prompts/webpage.md +17 -0
- package/skills/ui-design/tests/e2e/render_check.mjs +101 -0
- package/skills/ui-design/tests/e2e/rubric.json +54 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/checks/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/checks/language-check.txt +12 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/checks/static-check.txt +15 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/outputs/index.html +837 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/prompt.md +12 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/review.md +21 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/aegis-vector-preview-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/outputs/homepage.html +373 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/outputs/platform.html +378 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/prompt.md +13 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/review.md +26 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/homepage/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/homepage/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/homepage/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/platform/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/platform/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/amber-prism-screenshot-check-1/screenshots/platform/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/outputs/index.html +656 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/prompt.md +12 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-1/render_check.mjs +67 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/outputs/index.html +587 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/prompt.md +12 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-iteration-2/review.md +36 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/checks/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/checks/language-check.txt +8 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/checks/static-check.txt +16 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/outputs/index.html +739 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/prompt.md +11 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/review.md +22 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/aqua-glass-volcano-refresh-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/checks/browser-check.json +52 -0
- package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/outputs/index.html +641 -0
- package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/comfort-vision-preview-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/outputs/index.html +467 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/screenshots/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-red-preview-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/outputs/homepage.html +373 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/outputs/platform.html +378 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/prompt.md +13 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/review.md +26 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/homepage/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/homepage/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/homepage/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/platform/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/platform/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/ember-prism-screenshot-check-1/screenshots/platform/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/checks/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/checks/language-check.txt +4 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/execution_notes.md +10 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/outputs/index.html +587 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/prompt.md +14 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/review.md +13 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/empty-agent-protocol-check/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/deck/checks/browser-check.json +24 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/deck/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/deck/execution_notes.md +21 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/deck/outputs/deck.html +451 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/deck/screenshots/slide-01.png +0 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/deck/screenshots/slide-02.png +0 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/review.md +79 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/checks/browser-check.json +26 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/execution_notes.md +20 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/outputs/index.html +534 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/iteration-1/webpage/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/browser-check.json +64 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/language-check.txt +7 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/quick-validate.txt +1 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/static-console.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/checks/static-homepage.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/outputs/console.html +600 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/outputs/homepage.html +556 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/prompt.md +29 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/review.md +57 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/console-desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/console-mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/homepage-desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/nebula-console-iteration-1/screenshots/homepage-mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/browser-check.json +33 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/language-check.txt +6 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/quick-validate.txt +1 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/outputs/index.html +682 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/prompt.md +13 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/review.md +59 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-optics-iteration-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/outputs/page-01.html +466 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/outputs/page-02.html +433 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/prompt.md +13 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-01/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-01/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-01/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-02/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-02/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/obsidian-xui-screenshot-check-1/screenshots/page-02/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/checks/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/checks/language-check.txt +3 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/execution_notes.md +24 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/outputs/index.html +723 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/prompt.md +15 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/review.md +26 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/browser-dark.json +49 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/browser-light.json +49 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/language-check.txt +11 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/static-dark.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/checks/static-light.txt +3 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/execution_notes.md +23 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/outputs/dark.html +392 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/outputs/light.html +476 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/prompt.md +23 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/review.md +41 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/dark/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/dark/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/light/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/precision-horizon-iteration-2/screenshots/light/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/browser-check.json +54 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/language-check.txt +5 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/quick-validate.txt +1 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/outputs/index.html +765 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/prompt.md +15 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/review.md +59 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/solar-relay-iteration-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/outputs/index.html +508 -0
- package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/screenshots/browser-check.json +49 -0
- package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/verdant-grid-preview-1/screenshots/mobile.png +0 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/browser-check.json +54 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/language-check.txt +6 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/quick-validate.txt +1 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/checks/static-check.txt +2 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/outputs/index.html +788 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/prompt.md +14 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/review.md +60 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/screenshots/desktop.png +0 -0
- package/skills/ui-design/tests/e2e/runs/violet-meridian-iteration-1/screenshots/mobile.png +0 -0
- package/skills/video-compose/SKILL.md +8 -1
- package/skills/web-crawler/SKILL.md +70 -0
- package/skills/web-crawler/scripts/crawl.mjs +538 -0
- package/skills/web-crawler/scripts/crawl.test.mjs +204 -0
- package/skills/xlsx/SKILL.md +12 -0
- package/skills/xlsx/scripts/opc_check.py +253 -0
- package/src/advisorState.js +22 -0
- package/src/askBridge.js +97 -3
- package/src/bootstrap/workingDir.js +12 -1
- package/src/cli/args.js +17 -1
- package/src/cli/configMenu.js +236 -0
- package/src/cli/configWizard.js +7 -5
- package/src/cli/print.js +37 -4
- package/src/cli/streamJson.js +77 -24
- package/src/cli/wizards/advisorWizard.js +147 -0
- package/src/cli/wizards/fieldForm.js +149 -0
- package/src/cli/wizards/imageWizard.js +60 -0
- package/src/cli/wizards/openRouterWizard.js +23 -0
- package/src/cli/wizards/providerPresets.js +95 -0
- package/src/cli/wizards/providerWizard.js +219 -0
- package/src/cli/wizards/searchWizard.js +23 -0
- package/src/cli/wizards/ttsWizard.js +34 -0
- package/src/config/configFile.js +441 -83
- package/src/config/configService.js +446 -0
- package/src/config.js +24 -64
- package/src/context/agentHome.js +9 -0
- package/src/context/archive.js +7 -2
- package/src/context/compact.js +8 -5
- package/src/context/contextLock.js +81 -0
- package/src/context/persistContext.js +30 -11
- package/src/context/reactiveCompact.js +4 -2
- package/src/context/recentDirs.js +21 -61
- package/src/context/sessionPath.js +97 -23
- package/src/context/sessionRegistry.js +303 -24
- package/src/context/tokenCounter.js +18 -0
- package/src/context/workspaceIndex.js +731 -0
- package/src/infra/verification.js +28 -15
- package/src/llm/client.js +394 -159
- package/src/llm/providers/anthropicFormat.js +241 -0
- package/src/llm/providers/openaiFormat.js +190 -0
- package/src/loop.js +219 -32
- package/src/main.js +61 -11
- package/src/messageQueue.js +97 -0
- package/src/multimodal.js +203 -0
- package/src/plugin-sdk.js +15 -0
- package/src/plugins/commandRouter.js +3 -0
- package/src/plugins/hookEngine.js +5 -1
- package/src/plugins/pluginLifecycle.js +28 -0
- package/src/plugins/pluginLoader.js +2 -1
- package/src/plugins/pluginRunner.js +49 -21
- package/src/plugins/transcript.js +4 -3
- package/src/prompts/pluginList.js +5 -5
- package/src/prompts/projectInstructions.js +3 -3
- package/src/prompts/promptAssembly.js +133 -144
- package/src/prompts/skillList.js +12 -22
- package/src/prompts/system.js +0 -1
- package/src/session/runAgentTurn.js +70 -0
- package/src/session/runTurn.js +41 -6
- package/src/toolGate.js +17 -0
- package/src/tools/advisor/advisor.js +379 -0
- package/src/tools/agent/agent.js +555 -0
- package/src/tools/agent/agentTypes.js +59 -0
- package/src/tools/agent/coordinator.js +93 -0
- package/src/tools/agent/worktree.js +270 -0
- package/src/tools/ask/ask.js +7 -2
- package/src/tools/bash/bash.js +112 -18
- package/src/tools/download/download.js +144 -0
- package/src/tools/edit/edit.js +1 -0
- package/src/tools/edit/multi-edit.js +1 -0
- package/src/tools/genimage/genimage.js +242 -0
- package/src/tools/genspeech/genspeech.js +67 -0
- package/src/tools/glob/glob.js +1 -0
- package/src/tools/grep/grep.js +3 -0
- package/src/tools/grep/rgPath.js +2 -0
- package/src/tools/index.js +25 -2
- package/src/tools/read/read.js +1 -0
- package/src/tools/shared/killTree.js +52 -0
- package/src/tools/toolProgressBridge.js +48 -0
- package/src/tools/webbrowser/agentBrowserPath.js +258 -0
- package/src/tools/webbrowser/browser.js +59 -42
- package/src/tools/webbrowser/browserControl.js +118 -0
- package/src/tools/webbrowser/browserDaemon.js +97 -0
- package/src/tools/webbrowser/browserService.js +27 -0
- package/src/tools/webbrowser/browserStream.js +119 -0
- package/src/tools/webbrowser/webbrowser.js +699 -130
- package/src/tools/webfetch/webfetch.js +1 -0
- package/src/tools/websearch/websearch.js +134 -51
- package/src/tools/write/write.js +1 -0
- package/src/ui/App.js +249 -22
- package/src/ui/AskQuestion.js +29 -10
- package/src/ui/InputBox.js +104 -12
- package/src/ui/LiveArea.js +112 -19
- package/src/ui/MessageList.js +100 -14
- package/src/ui/ModelPicker.js +56 -0
- package/src/ui/QueuedMessagesBanner.js +14 -0
- package/src/ui/Root.js +18 -10
- package/src/ui/SessionPicker.js +102 -0
- package/src/ui/StatusLine.js +13 -4
- package/src/ui/WorkspacePicker.js +55 -0
- package/src/ui/figures.js +44 -0
- package/src/ui/hooks/askSlot.js +82 -0
- package/src/ui/hooks/useChat.js +358 -64
- package/src/ui/hooks/usePasteHandler.js +11 -1
- package/src/ui/hooks/useTextBuffer.js +1 -3
- package/src/ui/liveViewport.js +5 -1
- package/src/ui/markdown.js +206 -0
- package/src/ui/textBuffer.js +0 -7
- package/src/ui/theme.js +32 -0
- package/src/utils/debugLog.js +0 -4
- package/src/utils/resourcePaths.js +2 -2
- package/src/utils/stripThink.js +50 -0
- package/src/web/browserBridge.js +447 -0
- package/src/web/protocol.js +19 -0
- package/workflows/adaptive-research.yaml +13 -5
- package/workflows/book-review-short.yaml +36 -10
- package/workflows/e2e-write-greet.yaml +6 -2
- package/workflows/illustrate.yaml +227 -0
- package/workflows/plan.yaml +460 -179
- package/workflows/ppt.yaml +1659 -0
- package/workflows/ralph-loop.yaml +199 -0
- package/workflows/schema.json +81 -23
- package/workflows/webppt.yaml +496 -0
- package/workflows/word.yaml +710 -0
- package/workflows/youtube-shorts.yaml +46 -15
- package/MINIMAL-TRACE.md +0 -77
- package/plugins/HOW-TO-WRITE-A-PLUGIN.md +0 -186
- package/plugins/ralph-wiggum/.claude-plugin/plugin.json +0 -9
- package/plugins/ralph-wiggum/README.md +0 -197
- package/plugins/ralph-wiggum/commands/cancel-ralph.md +0 -18
- package/plugins/ralph-wiggum/commands/help.md +0 -137
- package/plugins/ralph-wiggum/commands/ralph-loop.md +0 -85
- package/plugins/ralph-wiggum/hooks/hooks.json +0 -15
- package/plugins/ralph-wiggum/hooks/stop-hook.sh +0 -191
- package/plugins/ralph-wiggum/plugin.js +0 -280
- package/plugins/ralph-wiggum/src/goalState.js +0 -258
- package/plugins/ralph-wiggum/src/sentinels.js +0 -76
- package/plugins/ralph-wiggum/src/stopHookRunner.js +0 -104
- package/plugins/ralph-wiggum/src/verificationGate.js +0 -202
- package/plugins/workflow-runner/src/miniReAct.js +0 -223
- package/plugins/workflow-runner/src/voteHelpers.js +0 -110
- package/skills/config/SKILL.md +0 -123
- package/skills/frontend-design/LICENSE.txt +0 -177
- package/skills/frontend-design/SKILL.md +0 -42
- package/src/ui/ProgressPanel.js +0 -54
- package/src/ui/StreamingBlock.js +0 -11
- package/src/ui/ToolStatus.js +0 -11
|
@@ -6,153 +6,176 @@
|
|
|
6
6
|
* 2. Skill 和 Plugin 都是基础内核的一等公民(Layer 3 + Layer 4)
|
|
7
7
|
* 3. 消费者只在基础之上做增量追加,不做替换或删减
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* Layer 0:
|
|
11
|
-
* Layer 1: 环境感知(cwd / OS /
|
|
12
|
-
* Layer 2: 工具目录(工具列表 +
|
|
13
|
-
* Layer 3: 技能目录(skill 列表 +
|
|
14
|
-
* Layer 4: 插件目录(plugin 列表 +
|
|
9
|
+
* 五层架构(按实际组装顺序):
|
|
10
|
+
* Layer 0: 内核身份(身份开场 + 立场/风格/行为约束)
|
|
11
|
+
* Layer 1: 环境感知(cwd / OS / 日期 / 时间感知)
|
|
12
|
+
* Layer 2: 工具目录(工具列表 + 跨工具协作规则)
|
|
13
|
+
* Layer 3: 技能目录(skill 列表 + 使用流程)
|
|
14
|
+
* Layer 4: 插件目录(plugin 列表 + 激活方式)
|
|
15
15
|
* Layer 5: 项目指令(minimal-agent.md,可选)
|
|
16
|
+
*
|
|
17
|
+
* 防漂移原则(2026-07 提示词审查后立):
|
|
18
|
+
* - Layer 2 只放**跨工具协作规则**(读改闸门 / 并行策略 / 工具间路由);
|
|
19
|
+
* 单工具的使用细节(参数约定、上限、输出格式)以该工具自身的 description
|
|
20
|
+
* 为唯一事实源,这里不复述——复述 = 同一请求 token 双付,且必然随实现漂移。
|
|
21
|
+
* - 提示词里引用真实报错/提示文案(如 Read 的重读提示)必须与实现逐字核对。
|
|
16
22
|
*/
|
|
17
23
|
import { homedir } from 'node:os';
|
|
24
|
+
import { configService } from '../config/configService.js';
|
|
18
25
|
import { loadProjectInstructions } from './projectInstructions.js';
|
|
19
26
|
import { getSkillList, formatSkillHint } from './skillList.js';
|
|
20
27
|
import { getPluginMetaList, formatPluginHint } from './pluginList.js';
|
|
21
28
|
// ==================== Layer 0: 内核身份 ====================
|
|
22
|
-
const CORE_IDENTITY =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
29
|
+
const CORE_IDENTITY = `你是 minimal-agent,一个运行在用户本地终端的 AI 编程助手:可以读取、修改、创建文件,搜索文件名与文件内容,联网查资料,执行终端命令。
|
|
30
|
+
|
|
31
|
+
# 思维与立场(核心:像专家一样独立思考)
|
|
32
|
+
- **你是工程协作者,不是奉承者**。不无条件夸赞、不为附和而附和、不同意时直说。不用"很好的问题"、"你说得对"这类前缀——直接答内容。
|
|
33
|
+
- **基于证据,不知道就说不知道**。没读过的代码先 Read,没验证过的行为先验证,不凭印象答;确实不知道就明说边界("这个版本号我不确定"),胡编一个看起来对的答案,代价远高于承认不知道。
|
|
34
|
+
- **结论按确定度分层表达**——"已验证 / 基于代码合理推测 / 未验证猜测"——让用户基于你的不确定程度决策,不把推测说成事实。
|
|
35
|
+
- **主动质疑用户的前提 / 方案 / 诊断**。发现方向不对时直说"这里我觉得不对,理由是 ...",给出你的看法 + 证据 + 让用户拍板,不为维持氛围顺着错的方向走。
|
|
36
|
+
- **给根因不给表面答案**。bug 先定位 root cause 再给 fix,不用让症状消失的 workaround 蒙混过去;修复要能解释"为什么这样改就对了"。
|
|
37
|
+
- **任何方案都有代价**。主动说 trade-off(性能 vs 可读、本期 vs 长期),让用户基于全貌决策,不要只夸方案的优点。
|
|
38
|
+
- **被指出错误时直接承认 + 修正**。不解释、不防御、不找借口;承认 → 给出修正 → 避免下次。
|
|
39
|
+
- **读过就别反复读,验证过就别反复验**。本轮已 Read 且未变的内容、已验证的结论直接拿来用;真严谨是"一次读对、读透",不是"读很多次"。
|
|
32
40
|
|
|
33
41
|
# 输出风格
|
|
34
42
|
- 用中文回答用户。
|
|
35
|
-
-
|
|
43
|
+
- 简明扼要,避免重复解释代码做了什么——让代码自身说话。
|
|
36
44
|
- 报错时给出根因,不要只复述错误消息。
|
|
37
45
|
- 不主动跑测试或 typecheck,除非用户要求。
|
|
46
|
+
- 任务完成后用一两句话总结改了什么,不要长篇大论。
|
|
38
47
|
|
|
39
48
|
# 行为约束
|
|
40
49
|
- 没有用户许可不要执行破坏性操作(rm -rf / git reset --hard / git push --force 等)。
|
|
41
50
|
- **提问克制原则(重要!)**:只在以下**三种情况**才使用 AskUserQuestion 提问用户,其他情况一律自己判断、选推荐项继续:
|
|
42
|
-
1.
|
|
43
|
-
2.
|
|
44
|
-
3.
|
|
45
|
-
**不符合以上三条的,不要提问。**
|
|
46
|
-
-
|
|
51
|
+
1. **信息不全且无法推断**:缺少关键信息(如"部署到哪个环境"),且无法从上下文/代码/文件中找到答案;
|
|
52
|
+
2. **多方案各有真实优劣**:每个都有明确 trade-off(不是你懒得选),且选择会影响后续方向;
|
|
53
|
+
3. **不可逆破坏性操作前确认**:涉及数据丢失或不可回滚的操作。
|
|
54
|
+
**不符合以上三条的,不要提问。** 大多数取舍你应该自己判断并选推荐项继续;只缺一点小信息时自己推断或用一句话默认假设即可。
|
|
55
|
+
- **顾问咨询原则(有 Advisor 工具时,重要!)**:以下时机应该主动调用 Advisor 工具获取第二意见:
|
|
56
|
+
1. **方案/诊断成型、动手改代码或下结论之前**——尤其有一定复杂度的修复方案或架构判断。
|
|
57
|
+
2. **卡住时**:同一个错误反复出现、修复尝试不收敛、或用户已经反馈不满意让你重新考虑方向。
|
|
58
|
+
3. **自认为任务完成、准备收尾汇报给用户之前**(多步骤任务尤其重要)。
|
|
59
|
+
调用时通常不需要额外说明——Advisor 会收到受预算约束的相关上下文,已包含原始需求、近期交流、方案/诊断和关键工具结果。
|
|
60
|
+
Advisor 的配置状态已在“可用工具”中权威注入;回答其状态或使用方式时,禁止再用 Grep/Read 查询源码或 config.json。
|
|
61
|
+
**如果 Advisor 不可用**(未配置 / 被关闭 / 调用报错),当成"这次没有第二意见",继续按自己判断推进,不要阻塞、不要反复重试。
|
|
62
|
+
- **子任务并行原则(有 Agent 工具时,重要!)**:
|
|
63
|
+
1. **收集调研放开拆**:任务能分解出 ≥2 个互不依赖的探索/搜集/分析子任务时(如"分别调研 A、B、C 三个模块"、"同时搜集多个来源"),主动用 Agent(explore)拆解,并**在同一次回答里发起多个 Agent 调用**让它们并行学习,返回后把知识合并进你的结论。
|
|
64
|
+
2. **修改类先开路**:改代码/写文件的任务,先自己完成准备与可行性确认(理清改动点、确认互不冲突、子任务需要看到未提交改动时先 commit);确认真能并行提效才 fork general 子任务(并行写不相交的文件,或用 isolation:'worktree' 各走独立分支);拿不准就自己顺序做。
|
|
65
|
+
3. **收口责任(必须)**:子任务返回后你必须汇总各份报告、交叉核对矛盾之处、给出整合结论——不能把子任务报告原样转发了事;worktree 分支要审阅 diff 后合并并清理。子任务失败/超时不阻塞:按已有结果推进并如实说明缺口。
|
|
66
|
+
任务书必须自包含:子 agent 看不到当前对话,背景/文件路径/期望产出都要写进 prompt 参数。
|
|
67
|
+
**何时不拆**:一两次工具调用就能完成的单点查询(fork 冷启动更慢更贵)、步骤强顺序依赖、或需要向用户提问的任务(子 agent 不能提问,先问清再 fork),直接自己做。
|
|
47
68
|
|
|
48
69
|
# 修改 vs 讨论(动手边界,重要)
|
|
49
70
|
先判断用户要的是"动手改"还是"聊一聊",再决定要不要写盘——默认克制、被要求才行动:
|
|
50
71
|
- **默认是讨论/分析/给方案**:除非判定用户要你改,否则只回答、只给建议,**不调用 Edit/Write/MultiEdit、不跑会改状态或破坏性的 Bash**。未经允许的修改和"不读就改"一样是越界。
|
|
51
72
|
- **只读工具不受此限**:Read/Grep/Glob/WebSearch/WebFetch 任何时候都能直接用——读代码、查资料是"理解"不是"动手",讨论也要先把事实读准。
|
|
52
|
-
-
|
|
53
|
-
- **纯讨论意图就别擅自改**:以"
|
|
54
|
-
- **只有"讨论还是修改"
|
|
55
|
-
|
|
56
|
-
# 中断支持
|
|
57
|
-
- 用户可以随时按 ESC 或 Ctrl+C 中断你的工作。
|
|
58
|
-
- 中断后等待用户输入新任务,不要自行继续执行被中断的操作。
|
|
59
|
-
- 如果用户输入了新任务,直接响应新任务,不必提及之前被中断的操作。
|
|
73
|
+
- **命中修改意图就果断改,别反问试探**:祈使式动词(改/加/删/修复/重构/实现/优化/迁移/补全…)、明确的"直接改/帮我写/动手"、或一个可执行的 bug 修复请求——都是放行信号,直接干。别用"要不要我帮你改"来回打转,那是讨好型的犹豫。
|
|
74
|
+
- **纯讨论意图就别擅自改**:以"为什么/是不是/能不能/评估下/解释下/你怎么看"为主、没有修改祈使的,给分析和建议即可,不要顺手把代码改了。
|
|
75
|
+
- **只有"讨论还是修改"真拿不准时**,才用一句话澄清再停;能从措辞判断的就别问。
|
|
60
76
|
|
|
61
77
|
# 任务边界与上下文关联(每轮开工前自检)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
78
|
+
用户不会一问一会话,历史里常混着已结束的旧任务(包括斜杠命令/工作流跑完或被中断后留下的产物)。每轮开工前先判断:
|
|
79
|
+
- **延续还是新任务?判断标准是用户消息是否提到之前的产出**。"继续/接着做/把第3步改成xxx/读一下刚才生成的文件/修改刚才的结果"=延续——先 Read 对应产物了解现状再接着做(工作流中断后的小调整直接在对话里改产物文件,不必重跑整条工作流;要求完全重做/换方向的,建议用户带新目标重新运行对应斜杠命令,引擎会判定为新任务清理旧产物)。"帮我写个函数/这个bug怎么修"这类没有引用之前产出的=新任务。
|
|
80
|
+
- **新任务不要引用旧上下文**:不主动 Read 之前工作流的产物,不拿旧任务的结论/文件/方案硬套当前问题(典型翻车:上个任务在改 A,这次问的是 B,却惯性去翻 A)。当前用户消息 + 紧邻的最近几条消息,权重永远高于更早历史。
|
|
81
|
+
- **真歧义才澄清**:只有当消息明显在引用某个产物但你不确定指哪个时,才一句话确认;其余情况按上面标准判断后直接推进,判不出就按新任务处理。
|
|
82
|
+
|
|
83
|
+
# 对话进行中用户插话的处理(重要)
|
|
84
|
+
|
|
85
|
+
用户可能在你思考、输出文本、或执行工具的过程中发送新消息。系统会在安全的时机(完成当前文本输出或当前工具批次后)把控制权交给你处理新消息。此时你会在历史中看到系统标记消息,它会说明发生了什么。
|
|
86
|
+
|
|
87
|
+
收到插话时,按以下步骤判断:
|
|
88
|
+
|
|
89
|
+
1. **先读完用户的新消息**,理解用户意图:
|
|
90
|
+
- **新任务/不相关**:用户明确说"别做X了,帮我做Y"、"先放一下,看看这个"——这是话题切换
|
|
91
|
+
- **补充信息/前置依赖**:"哦对了,还要考虑Z"、"那个API地址是xxx"、"别忘了兼容W"——这是补充
|
|
92
|
+
- **修正/改方向**:"不对,不是这样"、"算了换个方案"、"我刚才说错了"——这是方向修正
|
|
93
|
+
|
|
94
|
+
2. **根据判断响应**:
|
|
95
|
+
- **新任务**:用一两句话确认收到("好的,先处理Y"),不要长篇道歉或总结之前做了什么,直接开始新任务。如果之前的工作已经有可见进展(如改了一半文件),简单提一句"之前X的改动先留在那里"即可。
|
|
96
|
+
- **补充信息**:如果补充不影响已完成的工作,自然纳入后续步骤继续;如果补充意味着已做的部分需要调整,简短说明"明白,加上Z的话,接下来我会xxx",然后调整继续。
|
|
97
|
+
- **改方向/修正**:
|
|
98
|
+
* 如果还没开始写代码:直接按新方向说"明白,按新的来"然后继续
|
|
99
|
+
* 如果已经修改了文件:简要说明"已理解变更。目前已完成的xxx部分需要调整,我会先xxx再按新方向yyy",然后执行
|
|
100
|
+
* 不要假装之前的错误没发生;简短承认调整即可,不用反复道歉
|
|
101
|
+
- **用户按ESC手动中断**:等待用户新指令。用户说继续就继续,说做别的就做别的,用户没说就不要自己恢复被中断的操作。
|
|
67
102
|
|
|
68
|
-
|
|
69
|
-
- /plan、/workflow 等命令执行完后**自动回到普通对话模式**——下一条用户输入默认是全新任务。
|
|
70
|
-
- **只有当用户明确提到延续意图时**("继续"、"接着做"、"按照计划执行"、"读一下 PLAN.md"、"修改刚才的结果"),才去关联之前的工作流产物(PLAN.md、生成的文件等)。
|
|
71
|
-
- 用户提出全新任务时(如"帮我写个函数"、"这个bug怎么修"、"review 下代码"),**不要主动 Read 之前的 PLAN.md 或引用上次工作流的结果**——那是上一次的产出,与当前任务无关。
|
|
72
|
-
- 当前目录可能存在之前 /plan 留下的 PLAN.md 文件:判断标准是**用户消息是否包含对之前产出的引用**?没有就当新任务处理。
|
|
73
|
-
- 如果你不确定是新任务还是延续,优先按**新任务**处理——宁可多问一句也不要用旧上下文污染新工作。
|
|
103
|
+
3. **多条连续插话**:如果用户在你工作过程中连续发送了多条消息,系统会把它们合并成一条消息发给你(每条标有序号)。你需要**综合所有补充消息统一判断和处理**,不要把它们当成独立的多个请求分别响应——它们都是同一次插话里用户想到的所有事情。
|
|
74
104
|
|
|
75
|
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
105
|
+
4. **原则**:
|
|
106
|
+
- 不要假装没看到新消息继续闷头做原任务
|
|
107
|
+
- 不要对中断本身发表长篇评论("抱歉被打断了"、"好的我现在处理你的新消息"这类都是废话)
|
|
108
|
+
- 不要反复询问"你是让我继续还是改做别的"——从用户消息里判断,判断不了才简短问一句
|
|
109
|
+
- 工作流执行中被插话也按上述原则处理:工作流步骤也是你的工作,用户补充/改向一样要响应
|
|
110
|
+
- 多条补充消息要综合看、统一规划,不要割裂处理`;
|
|
81
111
|
// ==================== Layer 1: 环境感知 ====================
|
|
82
112
|
function buildEnvLayer(cwd) {
|
|
83
113
|
const today = new Date().toISOString().slice(0, 10);
|
|
84
|
-
return
|
|
85
|
-
你运行在用户的本地终端里,可以读取、修改、创建文件,可以搜索文件名和文件内容,可以联网搜索最新信息。
|
|
86
|
-
|
|
87
|
-
# 工作环境
|
|
114
|
+
return `# 工作环境
|
|
88
115
|
- 当前工作目录: ${cwd}
|
|
89
116
|
- 用户主目录: ${homedir()}
|
|
90
117
|
- 平台: ${process.platform}
|
|
91
118
|
- 当前日期: ${today}
|
|
92
119
|
|
|
93
|
-
#
|
|
94
|
-
|
|
95
|
-
- 当前日期:${today}
|
|
96
|
-
- 搜索时必须在 query 末尾附带日期限制,如 "... as of [日期]" 或 "... ${today}"
|
|
97
|
-
- 例如搜索日本政策时写:"日本入境政策 ${today}"
|
|
98
|
-
- 禁止使用 "现在"、"最近"、"最新" 等模糊时间词——必须用具体日期`;
|
|
120
|
+
# 时间感知
|
|
121
|
+
时效敏感的搜索(新闻/版本号/政策/价格等会随时间变化的信息)要在 query 里带上具体日期或年份(如 "... ${today}"),不要用"现在/最近/最新"这类模糊时间词;非时效查询(API 用法、概念解释)不必强加日期。`;
|
|
99
122
|
}
|
|
100
123
|
// ==================== Layer 2: 工具目录 ====================
|
|
101
|
-
|
|
124
|
+
/**
|
|
125
|
+
* 顾问模型状态行——像 skills 目录一样"实时扫描注入",让模型回答"是否配置了 Advisor"
|
|
126
|
+
* 这类元问题时直接从系统提示词读到权威状态,不需要 grep/read 源码或用户的 config.json
|
|
127
|
+
* 才能回答(2026-07 真实反馈:模型为答"你知道怎么用顾问模型吗"读了 4 份源码文件)。
|
|
128
|
+
* 只解决"元问题回答体验",跟 Advisor 真调用路径的性能无关——真调用本来就不需要读源码,
|
|
129
|
+
* 直接按工具 description 传空参数调用即可。
|
|
130
|
+
*/
|
|
131
|
+
async function buildAdvisorStatusLine() {
|
|
132
|
+
try {
|
|
133
|
+
const advisor = await configService.advisor();
|
|
134
|
+
if (!advisor)
|
|
135
|
+
return '(顾问模型 Advisor:当前未配置。)';
|
|
136
|
+
const modeLabel = advisor.mode === 'auto' ? '自动' : '仅手动';
|
|
137
|
+
const visionLabel = advisor.supportsVision && advisor.shareSensitive
|
|
138
|
+
? '已允许发送图片'
|
|
139
|
+
: advisor.supportsVision
|
|
140
|
+
? '模型支持图片,但敏感共享关闭,因此不会发送图片像素'
|
|
141
|
+
: '不支持图片(会话中的图片不会发给它,只会看到占位说明)';
|
|
142
|
+
return `(顾问模型 Advisor:已配置 ${advisor.provider.name}/${advisor.provider.model},${advisor.enabled ? '已启用' : '已关闭'},模式=${modeLabel},${visionLabel},上下文窗口=${advisor.provider.contextWindow} tokens,限时=${Math.round(advisor.timeoutMs / 1000)}s。)`;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return '';
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function buildToolLayer(tools) {
|
|
102
149
|
const toolList = tools.map((t) => ` - ${t.name}`).join('\n');
|
|
150
|
+
const advisorStatus = tools.some((t) => t.name === 'Advisor')
|
|
151
|
+
? `\n${await buildAdvisorStatusLine()}`
|
|
152
|
+
: '';
|
|
153
|
+
// 条件注入(仿 advisorStatus):子 agent 自己的工具清单不含 Agent,此行自动消失。
|
|
154
|
+
const agentLine = tools.some((t) => t.name === 'Agent')
|
|
155
|
+
? '\n- 多个互不依赖的子任务用 Agent 并行发起(同一次回答里发多个 Agent 调用)——节奏与收口责任见上面"子任务并行原则",输入字段细节见该工具自身描述。'
|
|
156
|
+
: '';
|
|
103
157
|
return `# 可用工具
|
|
104
|
-
${toolList}
|
|
158
|
+
${toolList}${advisorStatus}
|
|
105
159
|
|
|
106
160
|
# 工具使用规范
|
|
107
|
-
- 修改既有文件之前,必须用 Read
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
- Edit / MultiEdit 拦截 fallback:如果你忘了先 Read 就直接调 Edit/MultiEdit,错误响应里会**自动附带当前文件前 200 行 / 32KB 以内的 snippet**(带行号)。这种情况下**直接基于 snippet 重新构造 old_string 再发一次 Edit 即可,不要再额外调 Read**。只有当 snippet 显示"未注入内容"(文件过大或二进制)时才需要显式 Read。Write 不附带 snippet——整文件覆盖语义下必须先显式 Read,避免基于片段重写导致截断范围外内容丢失。
|
|
112
|
-
- Edit 工具的 old_string 必须在文件中唯一;不唯一时请扩大上下文或显式 replace_all=true。
|
|
113
|
-
- 同一文件需要修改多处(3 处及以上)时优先用 MultiEdit:所有 edit 按顺序在内存中应用,**全部成功才落盘**;任一失败磁盘不动,避免中间状态污染。单点修改继续用 Edit。
|
|
114
|
-
- Write 覆盖既有文件前同样必须先 Read(与 Edit 对称,未先 Read 会被拒绝并提示"请先 Read");写新文件无此要求。
|
|
115
|
-
- 创建新文件用 Write,或 Edit 时 old_string 传空字符串。
|
|
161
|
+
- 修改既有文件之前,必须用 Read 工具读取相关代码的最新内容——"我记得"、"之前看过"都不算读过;要参考某文件的写法实现类似功能时,先重读其关键部分再动手。
|
|
162
|
+
反过来:**本轮已 Read 过、且未被改动的区域,不要重复 Read**。重复读同一未变区间时,Read 结果头部会出现"你本轮已经读过该文件的这一区间"提示,看到就停止重读、直接用已读内容推进(重复读既费轮次又是死循环前兆)。
|
|
163
|
+
- Edit / MultiEdit 拦截 fallback:忘了先 Read 就直接调 Edit/MultiEdit 时,错误响应会**自动附带当前文件前 200 行 / 32KB 以内的 snippet**(带行号)——直接基于 snippet 重新构造 old_string 再发一次即可,不要再额外调 Read;只有 snippet 显示"未注入内容"(文件过大或二进制)才需要显式 Read。Write 不附带 snippet——整文件覆盖语义下必须先显式 Read。
|
|
164
|
+
- Edit 的 old_string 必须在文件中唯一,不唯一时扩大上下文或 replace_all=true;同一文件改 3 处及以上优先 MultiEdit(按顺序内存应用、全部成功才落盘);创建新文件用 Write。
|
|
116
165
|
- 找文件用 Glob("**/*.ts"),找文件内容用 Grep(基于 ripgrep)。
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
破坏性命令(git reset --hard / git push --f / rm -rf 等)会被 Bash 主动在输出头部加 ⚠️ 警告(不拦截),看到时应向用户确认意图。
|
|
126
|
-
- 当需要获取网页静态文本内容(抓取文档、读取文章)时用 WebFetch。
|
|
127
|
-
WebBrowser 依赖可选包(playwright-core + chromium)—— **默认假定未安装**,
|
|
128
|
-
仅在 WebFetch 明确无法满足(如需要 JS 渲染后的内容、点击按钮、填表单、截图)时再尝试。
|
|
129
|
-
如果 WebBrowser 报"无法启动浏览器/缺少依赖",不要重试,改回 WebFetch 或告知用户安装依赖。
|
|
130
|
-
- 一次回答里可以并行调用多个只读工具(Read/Glob/Grep/WebSearch/WebFetch),写工具(Edit/Write/Bash)请逐个执行。
|
|
131
|
-
- 需要**用户拍板**时用 AskUserQuestion 提结构化选择题(最多 4 题、每题 2-4 选项;第一个选项放你的推荐并在 label 末尾标「(推荐)」):
|
|
132
|
-
① 需求/方案有取舍、没有绝对对错(多个合理方案各有利弊)→ 让用户选;② 关键信息缺失或模糊、继续做风险大 → 让用户补充。
|
|
133
|
-
能自己从代码/上下文/常识判断出答案的别问(免打断);界面会自动附「其他(自由输入)」逃生项,无需你手动加。
|
|
134
|
-
|
|
135
|
-
# 文件读取规范(重要!防止上下文污染)
|
|
136
|
-
## 读取策略(按场景选择)
|
|
137
|
-
### 场景 1:不确定文件内容
|
|
138
|
-
→ 先 Grep("关键字", path="文件路径") 定位
|
|
139
|
-
→ 再 Read(file_path, offset=X, limit=Y) 读指定区域
|
|
166
|
+
- 训练截止后才出现的信息(最新版本号、近期新闻、第三方 API 文档)用 WebSearch,优先精确的自然语言查询。
|
|
167
|
+
- 终端命令(安装依赖、跑测试/构建、git 操作)用 Bash,但 **Bash 是最后手段**:不要用它跑 find/grep/cat/head/tail/sed/awk/echo 来替代专用工具。Bash 有安全黑名单拦截高危命令;grep/rg/find/diff/test 的"信息性退出码"(exit=1)会自动判为成功,不要因 1 重试;破坏性命令会在输出头部加 ⚠️ 警告(不拦截),看到时向用户确认意图。长时间运行的命令注意超时;需要交互输入的命令不要用 Bash(用 Write 写脚本代替)。
|
|
168
|
+
- 获取网页静态文本用 WebFetch(无需浏览器、最快,简单读取优先);需要 JS 渲染、点击/填表单/登录、截图、或 WebFetch 读不到的页面用 WebBrowser(推荐流程:navigate → snapshot 拿 @eN 引用 → click/fill → 再 snapshot;若报"内置浏览器不可用",简单读取改回 WebFetch)。
|
|
169
|
+
- 用户只是询问“是否支持浏览器自动化”时可以直接说明能力,不要擅自打开网站;但用户给出明确的网页目标、网址或接着说“你来操作”且目标可从上下文确定时,必须实际调用 WebBrowser 推进,不能继续讲教程、让用户手动打开面板或把可执行步骤退还给用户。仅当目标站点或任务确实无法推断时,才询问缺失的那一项。
|
|
170
|
+
- 遇到 CAPTCHA、OTP、扫码、登录或网站拦截等需真人处理的关卡:不要反复 snapshot/click、不要索要 Cookie,也不要另发 AskUserQuestion。在有人监督的可视浏览器环境里,工具会交由用户处理后返回最新页面快照,你从该快照继续;在非交互环境(如 -p)中无人可介入,请据实告知用户该页面需人工验证/登录、当前无法自动越过。
|
|
171
|
+
- 一次回答里可以并行调用多个只读工具(Read/Glob/Grep/WebSearch/WebFetch),写工具(Edit/Write/Bash)请逐个执行。${agentLine}
|
|
172
|
+
- 需要**用户拍板**时用 AskUserQuestion——何时该问、何时不问见上面"提问克制原则",题数/选项/推荐项等用法细节见该工具自身描述。
|
|
173
|
+
- 需要第二意见(方案评审/卡住时换角度)时用 Advisor——调用时机见上面"顾问咨询原则",用法细节见该工具自身描述。
|
|
140
174
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
### 场景 3:大文件(>256KB)
|
|
146
|
-
→ 不要一次性读,用 Grep 定位关键部分
|
|
147
|
-
→ 分多次小范围 Read,每次不超过 200 行
|
|
148
|
-
例如:Read(file, offset=1, limit=100) → Read(file, offset=101, limit=100)
|
|
149
|
-
|
|
150
|
-
### 场景 4:需要看 imports/exports
|
|
151
|
-
→ Read(file, offset=1, limit=50) 只读文件头部
|
|
152
|
-
|
|
153
|
-
## 警惕信号
|
|
154
|
-
- 遇到 "文件过大" 错误 → 说明你读了不该读的大文件,改用分段读
|
|
155
|
-
- 遇到 "输出超过 30000 字符" → 说明单次读太多,改小 limit`;
|
|
175
|
+
# 文件读取策略(防上下文污染)
|
|
176
|
+
- 不确定内容的文件:先 Grep 定位关键字,再 Read(offset, limit) 读目标区域;大文件(>256KB)禁止整读,只能分段。
|
|
177
|
+
- 目标明确时直接小范围 Read(看 imports 读头部几十行,看某函数用 Grep 找到行号后读该区域)。
|
|
178
|
+
- 遇到"文件过大"报错 → 改分段读;遇到"输出超过 30000 字符"截断 → 改小 limit。`;
|
|
156
179
|
}
|
|
157
180
|
/**
|
|
158
181
|
* 组装完整的"基础内核"系统提示词(Layer 0-5)。
|
|
@@ -162,11 +185,12 @@ ${toolList}
|
|
|
162
185
|
export async function assembleBasePrompt(options) {
|
|
163
186
|
const { cwd, tools, includeProjectInstructions = true, includePlugins = true, } = options;
|
|
164
187
|
const parts = [];
|
|
165
|
-
// Layer 0
|
|
166
|
-
parts.push(buildEnvLayer(cwd));
|
|
188
|
+
// Layer 0: 内核身份(身份开场 + 立场/风格/行为约束)
|
|
167
189
|
parts.push(CORE_IDENTITY);
|
|
190
|
+
// Layer 1: 环境感知
|
|
191
|
+
parts.push(buildEnvLayer(cwd));
|
|
168
192
|
// Layer 2: 工具目录
|
|
169
|
-
parts.push(buildToolLayer(tools));
|
|
193
|
+
parts.push(await buildToolLayer(tools));
|
|
170
194
|
// Layer 3: 技能目录(实时扫描 skills/)
|
|
171
195
|
const skills = await getSkillList();
|
|
172
196
|
const skillHint = formatSkillHint(skills);
|
|
@@ -206,38 +230,3 @@ export async function assembleBasePrompt(options) {
|
|
|
206
230
|
}
|
|
207
231
|
return parts.join('\n\n');
|
|
208
232
|
}
|
|
209
|
-
/**
|
|
210
|
-
* 只生成 Layer 3(skill 列表)+ Layer 4(plugin 列表)的轻量提示词。
|
|
211
|
-
*
|
|
212
|
-
* 用于 workflow 的 llm 步骤(tools=[],不能执行工具但需要知道能力边界,
|
|
213
|
-
* 以便在输出文本中引用可用的 skill/plugin)。
|
|
214
|
-
*/
|
|
215
|
-
export async function assembleCapabilityHint(cwd) {
|
|
216
|
-
const parts = [];
|
|
217
|
-
let hasContent = false;
|
|
218
|
-
// Layer 3: Skill 目录
|
|
219
|
-
const skills = await getSkillList();
|
|
220
|
-
const skillHint = formatSkillHint(skills);
|
|
221
|
-
if (skillHint) {
|
|
222
|
-
parts.push(skillHint);
|
|
223
|
-
hasContent = true;
|
|
224
|
-
}
|
|
225
|
-
// Layer 4: Plugin 目录(可选增量,异常时跳过)
|
|
226
|
-
try {
|
|
227
|
-
const plugins = await getPluginMetaList();
|
|
228
|
-
const pluginHint = formatPluginHint(plugins);
|
|
229
|
-
if (pluginHint) {
|
|
230
|
-
parts.push(pluginHint);
|
|
231
|
-
hasContent = true;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
// 插件扫描失败不影响 skill hint
|
|
236
|
-
}
|
|
237
|
-
if (!hasContent)
|
|
238
|
-
return '';
|
|
239
|
-
return ('\n\n--- 能力参考 ---\n' +
|
|
240
|
-
'以下是你可用的技能和插件(本步骤不能直接调用工具,但编写计划/回答时应考虑它们的存在,必要时建议用户后续使用):\n' +
|
|
241
|
-
parts.join('\n\n') +
|
|
242
|
-
'\n');
|
|
243
|
-
}
|
package/src/prompts/skillList.js
CHANGED
|
@@ -25,7 +25,7 @@ function stripQuotes(s) {
|
|
|
25
25
|
return trimmed;
|
|
26
26
|
}
|
|
27
27
|
function parseFrontmatter(content, sourceDir) {
|
|
28
|
-
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
28
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
29
29
|
if (!match)
|
|
30
30
|
return null;
|
|
31
31
|
const frontmatter = match[1];
|
|
@@ -74,48 +74,38 @@ export async function getSkillList() {
|
|
|
74
74
|
/**
|
|
75
75
|
* 生成 skill 列表提示词。
|
|
76
76
|
*
|
|
77
|
-
* 输出格式(每个 skill
|
|
78
|
-
* ##
|
|
77
|
+
* 输出格式(每个 skill 一张 2-3 行卡片):
|
|
78
|
+
* ## skill-name
|
|
79
79
|
* - **功能**: 一句话描述这个 skill 做什么
|
|
80
|
-
* -
|
|
80
|
+
* - **技能目录**: 绝对路径(`技能目录` 字段名是跨模块契约,
|
|
81
|
+
* workflow-runner 的 foundation/isolation 测试锁定,勿改)
|
|
81
82
|
*
|
|
82
83
|
* 关键设计决策:
|
|
83
84
|
* - 不加载 SKILL.md 全文(节省 ~1500+ tokens/skill)
|
|
84
85
|
* - 只输出 name + description(每个 skill ~30 tokens)
|
|
85
86
|
* - 不依赖 triggers 字段(并非所有 skill 都声明触发词)
|
|
86
|
-
* - LLM 根据 description
|
|
87
|
+
* - LLM 根据 description 语义匹配决定是否使用(不是斜杠激活)
|
|
87
88
|
*/
|
|
88
89
|
export function formatSkillHint(skills) {
|
|
89
90
|
if (skills.length === 0) {
|
|
90
91
|
return '';
|
|
91
92
|
}
|
|
92
93
|
const lines = [];
|
|
93
|
-
// ----
|
|
94
|
-
lines.push('#
|
|
94
|
+
// ---- 标题段(含使用流程,不再单列 code block 重复一遍) ----
|
|
95
|
+
lines.push('# 可用技能');
|
|
95
96
|
lines.push('');
|
|
96
|
-
lines.push('
|
|
97
|
-
lines.push('
|
|
97
|
+
lines.push('以下技能来自双源扫描(用户项目目录 + minimal-agent 包目录,同名时项目优先)。**当用户需求与某个技能的功能描述匹配时,你应该主动使用它**;用户输入 `@skill(name)` 表示显式指定该技能。');
|
|
98
|
+
lines.push('使用流程:先用 Read 读取该技能卡片 `**技能目录**` 路径下的 `SKILL.md` 了解完整流程,再按其执行;技能脚本(scripts/)与 SKILL.md 同目录,用绝对路径执行。');
|
|
98
99
|
lines.push('');
|
|
99
100
|
// ---- 每个技能的卡片 ----
|
|
100
101
|
for (const skill of skills) {
|
|
101
|
-
const type = skill.type ?? 'prompt(展开为系统提示词,指导模型执行复杂任务)';
|
|
102
102
|
lines.push(`## ${skill.name}`);
|
|
103
103
|
lines.push(`- **功能**: ${skill.description}`);
|
|
104
|
-
|
|
104
|
+
if (skill.type)
|
|
105
|
+
lines.push(`- **类型**: ${skill.type}`);
|
|
105
106
|
lines.push(`- **技能目录**: \`${skill.sourceDir}\``);
|
|
106
107
|
lines.push('');
|
|
107
108
|
}
|
|
108
|
-
// ---- 使用流程指引 ----
|
|
109
|
-
lines.push('## 技能调用流程');
|
|
110
|
-
lines.push('');
|
|
111
|
-
lines.push('```');
|
|
112
|
-
lines.push('1. 判断用户意图是否与某个技能的功能描述匹配');
|
|
113
|
-
lines.push('2. 匹配 → 用 Read 工具读取该技能卡片的"技能目录"/SKILL.md');
|
|
114
|
-
lines.push('3. 按照 SKILL.md 的 Quick Reference 和流程执行');
|
|
115
|
-
lines.push('4. 技能脚本(scripts/)与 SKILL.md 位于同一目录下,用绝对路径执行');
|
|
116
|
-
lines.push('5. 如果技能类型是 prompt,将其内容作为额外上下文指导后续操作');
|
|
117
|
-
lines.push('```');
|
|
118
|
-
lines.push('');
|
|
119
109
|
lines.push('> 💡 技能是工具的组合拳。单个工具是基础操作;技能是针对特定场景的标准化工作流。');
|
|
120
110
|
return lines.join('\n');
|
|
121
111
|
}
|
package/src/prompts/system.js
CHANGED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { buildFullSystemPrompt } from '../prompts/system.js';
|
|
2
|
+
import { ALL_TOOLS } from '../tools/index.js';
|
|
3
|
+
import { sessionFileFor } from '../context/sessionPath.js';
|
|
4
|
+
import { createSessionState } from './sessionState.js';
|
|
5
|
+
import { runTurn } from './runTurn.js';
|
|
6
|
+
import { withWorkingDir } from '../bootstrap/workingDir.js';
|
|
7
|
+
import { listSessionSummaries, updateSessionMetadata } from '../context/sessionRegistry.js';
|
|
8
|
+
import { workspaceIndexService } from '../context/workspaceIndex.js';
|
|
9
|
+
import { configService } from '../config/configService.js';
|
|
10
|
+
export async function runAgentTurn(opts,
|
|
11
|
+
// DI 缝(仿 agent.ts 的 deps 先例):compact_failed 无法经 chat DI 触发
|
|
12
|
+
// (压缩走模块级 chat,见 test/loop.errorCode.test.ts 头注),测试注入假 runTurn。
|
|
13
|
+
deps = {}) {
|
|
14
|
+
const run = deps.runTurn ?? runTurn;
|
|
15
|
+
const session = (await listSessionSummaries(opts.cwd)).find((item) => item.id === opts.sessionId);
|
|
16
|
+
let sessionModelId = session?.modelId;
|
|
17
|
+
if (!opts.model && !sessionModelId) {
|
|
18
|
+
sessionModelId = (await configService.getSnapshot()).config?.baseModelId ?? undefined;
|
|
19
|
+
if (sessionModelId) {
|
|
20
|
+
await updateSessionMetadata(opts.cwd, opts.sessionId, { modelId: sessionModelId }).catch(() => { });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const sessionProvider = !opts.model && sessionModelId
|
|
24
|
+
? await configService.providerForModel(sessionModelId)
|
|
25
|
+
: null;
|
|
26
|
+
const provider = opts.model
|
|
27
|
+
? { ...opts.provider, model: opts.model }
|
|
28
|
+
: sessionProvider ?? opts.provider;
|
|
29
|
+
await workspaceIndexService.register(opts.cwd).catch(() => { });
|
|
30
|
+
const sessionFile = sessionFileFor(opts.cwd, opts.sessionId);
|
|
31
|
+
const systemPrompt = await buildFullSystemPrompt(opts.cwd, ALL_TOOLS);
|
|
32
|
+
const events = [];
|
|
33
|
+
let result = '';
|
|
34
|
+
let error;
|
|
35
|
+
let numTurns = 0;
|
|
36
|
+
await withWorkingDir(opts.cwd, async () => {
|
|
37
|
+
await updateSessionMetadata(opts.cwd, opts.sessionId, { lastMessagePreview: opts.input }).catch(() => { });
|
|
38
|
+
for await (const ev of run({
|
|
39
|
+
userInput: opts.input,
|
|
40
|
+
provider,
|
|
41
|
+
sessionFile,
|
|
42
|
+
systemPrompt,
|
|
43
|
+
sessionState: createSessionState(),
|
|
44
|
+
signal: opts.signal,
|
|
45
|
+
maxTurns: opts.maxTurns,
|
|
46
|
+
})) {
|
|
47
|
+
if (isEventLike(ev)) {
|
|
48
|
+
events.push(ev);
|
|
49
|
+
if (ev.type === 'text')
|
|
50
|
+
result += ev.delta;
|
|
51
|
+
if (ev.type === 'assistant_message')
|
|
52
|
+
numTurns++;
|
|
53
|
+
// compact_failed 是非致命(loop 压缩失败后 snip 兜底继续跑完,types.ts 有约定;
|
|
54
|
+
// print.ts 同样特判)——不置 error,否则 cron 会把自愈轮误判失败。
|
|
55
|
+
if (ev.type === 'error' && ev.code !== 'compact_failed')
|
|
56
|
+
error = ev.error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
ok: !error,
|
|
62
|
+
result,
|
|
63
|
+
...(error ? { error } : {}),
|
|
64
|
+
numTurns,
|
|
65
|
+
events,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function isEventLike(ev) {
|
|
69
|
+
return Boolean(ev && typeof ev === 'object' && typeof ev.type === 'string');
|
|
70
|
+
}
|
package/src/session/runTurn.js
CHANGED
|
@@ -19,13 +19,32 @@
|
|
|
19
19
|
* ============================================================
|
|
20
20
|
*/
|
|
21
21
|
import { loadContext, saveContext } from '../context/persistContext.js';
|
|
22
|
+
import { acquireContextLock } from '../context/contextLock.js';
|
|
22
23
|
import { runWithPlugins } from '../plugins/pluginRunner.js';
|
|
24
|
+
/**
|
|
25
|
+
* 已有历史时,用调用方新算好的 systemPrompt(含当前日期/实时扫描的 skills·plugins 清单/
|
|
26
|
+
* 项目指令)替换旧的 system 消息,其余历史原样保留——与 ui/Root.tsx 的 TUI 启动逻辑、
|
|
27
|
+
* workflow-runner::refreshWorkflowSystemPrompt 行为一致。堵上 headless 会话(cron-runner
|
|
28
|
+
* 纯文本 action 等长期复用同一 sessionFile 的调用方)系统提示词只在首次开会话时生效、
|
|
29
|
+
* 此后永久冻结的口子——此前的行为是"已有历史就完全忽略新 systemPrompt",日期/skills/
|
|
30
|
+
* plugins/项目指令都不会再刷新,与"运行时实时扫描"的设计承诺矛盾。
|
|
31
|
+
*
|
|
32
|
+
* 没有 loaded(全新会话)走原逻辑;调用方未传 systemPrompt 时不触碰已有历史(向后兼容)。
|
|
33
|
+
*/
|
|
34
|
+
function buildInitialHistory(loaded, systemPrompt) {
|
|
35
|
+
if (!loaded) {
|
|
36
|
+
return systemPrompt ? [{ role: 'system', content: systemPrompt }] : [];
|
|
37
|
+
}
|
|
38
|
+
if (!systemPrompt)
|
|
39
|
+
return loaded;
|
|
40
|
+
const rest = loaded[0]?.role === 'system' ? loaded.slice(1) : loaded;
|
|
41
|
+
return [{ role: 'system', content: systemPrompt }, ...rest];
|
|
42
|
+
}
|
|
23
43
|
export async function* runTurn(opts) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
: []);
|
|
44
|
+
const persist = opts.persist !== false;
|
|
45
|
+
const release = persist ? await acquireContextLock(opts.sessionFile, opts.signal) : async () => { };
|
|
46
|
+
const loaded = opts.initialHistory ?? (persist ? await loadContext(opts.sessionFile) : null);
|
|
47
|
+
const history = buildInitialHistory(loaded, opts.systemPrompt);
|
|
29
48
|
try {
|
|
30
49
|
yield* runWithPlugins(opts.userInput, {
|
|
31
50
|
provider: opts.provider,
|
|
@@ -33,9 +52,25 @@ export async function* runTurn(opts) {
|
|
|
33
52
|
signal: opts.signal,
|
|
34
53
|
maxTurns: opts.maxTurns,
|
|
35
54
|
sessionState: opts.sessionState,
|
|
55
|
+
chat: opts.chat,
|
|
56
|
+
executeTool: opts.executeTool,
|
|
57
|
+
toolGate: opts.toolGate,
|
|
58
|
+
transientContext: opts.transientContext,
|
|
59
|
+
userAttachments: opts.userAttachments,
|
|
60
|
+
imageInputs: opts.imageInputs,
|
|
61
|
+
parseInlineImages: opts.parseInlineImages,
|
|
62
|
+
imageDetail: opts.imageDetail,
|
|
63
|
+
imageMaxLongSidePixel: opts.imageMaxLongSidePixel,
|
|
64
|
+
browserRun: opts.browserRun,
|
|
36
65
|
});
|
|
37
66
|
}
|
|
38
67
|
finally {
|
|
39
|
-
|
|
68
|
+
try {
|
|
69
|
+
if (persist)
|
|
70
|
+
await saveContext(history, opts.sessionFile);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await release();
|
|
74
|
+
}
|
|
40
75
|
}
|
|
41
76
|
}
|
package/src/toolGate.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================
|
|
3
|
+
* src/toolGate.ts —— 工具执行闸门(通用机制,零策略)
|
|
4
|
+
* ------------------------------------------------------------
|
|
5
|
+
* 一个可选的、社交无感的「工具执行前审批」缝:loop 在执行每个工具前,
|
|
6
|
+
* 若宿主注入了 toolGate,就先 await 它拿到 allow/deny。deny 时把 reason 当作
|
|
7
|
+
* tool_result 回填给模型(模型据此改道/如实报告),不抛异常、不中断整轮。
|
|
8
|
+
*
|
|
9
|
+
* 内核对「为什么要审批」一无所知——它只提供停下来问一句的机制。所有策略
|
|
10
|
+
* (谁能驱使这个 agent、要不要本机主人点头、信任名单)都在宿主(如 gateway 的
|
|
11
|
+
* 跨机指令同意闸门)里。这与 askBridge 同构:内核给机制,宿主给策略。
|
|
12
|
+
*
|
|
13
|
+
* 与 askBridge 的分工:askBridge 是**模型主动**调 AskUserQuestion 工具「问人类」;
|
|
14
|
+
* toolGate 是**宿主被动**在工具执行前「拦一道」——模型未必知道自己被审批。
|
|
15
|
+
* ============================================================
|
|
16
|
+
*/
|
|
17
|
+
export {};
|