soloforge 1.2.8 → 1.2.9
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 +105 -321
- package/dist/adapters/claude_code/claude_md.d.ts +5 -0
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +6 -0
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/hooks.d.ts +4 -0
- package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
- package/dist/adapters/claude_code/hooks.js +5 -0
- package/dist/adapters/claude_code/hooks.js.map +1 -1
- package/dist/adapters/claude_code/server.d.ts.map +1 -1
- package/dist/adapters/claude_code/server.js +9 -21
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +5 -0
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +619 -205
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts +9 -0
- package/dist/adapters/codex/codex_config.d.ts.map +1 -1
- package/dist/adapters/codex/codex_config.js +11 -3
- package/dist/adapters/codex/codex_config.js.map +1 -1
- package/dist/adapters/codex/codex_rules.d.ts +5 -0
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
- package/dist/adapters/codex/codex_rules.js +8 -1
- package/dist/adapters/codex/codex_rules.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts +5 -0
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +32 -79
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/adapters/trae/trae_config.d.ts +4 -0
- package/dist/adapters/trae/trae_config.d.ts.map +1 -1
- package/dist/adapters/trae/trae_config.js +5 -7
- package/dist/adapters/trae/trae_config.js.map +1 -1
- package/dist/adapters/trae/trae_rules.d.ts +5 -0
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +7 -1
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/config_commands.d.ts +33 -0
- package/dist/bin/config_commands.d.ts.map +1 -0
- package/dist/bin/config_commands.js +222 -0
- package/dist/bin/config_commands.js.map +1 -0
- package/dist/bin/soloforge.js +609 -119
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/artifact_contract_registry.d.ts +138 -0
- package/dist/engine/artifact_contract_registry.d.ts.map +1 -0
- package/dist/engine/artifact_contract_registry.js +427 -0
- package/dist/engine/artifact_contract_registry.js.map +1 -0
- package/dist/engine/audit_pool.d.ts +40 -0
- package/dist/engine/audit_pool.d.ts.map +1 -1
- package/dist/engine/audit_pool.js +37 -1
- package/dist/engine/audit_pool.js.map +1 -1
- package/dist/engine/audit_sampler.d.ts +5 -0
- package/dist/engine/audit_sampler.d.ts.map +1 -1
- package/dist/engine/audit_sampler.js +6 -0
- package/dist/engine/audit_sampler.js.map +1 -1
- package/dist/engine/audit_verifier.d.ts.map +1 -1
- package/dist/engine/audit_verifier.js +5 -1
- package/dist/engine/audit_verifier.js.map +1 -1
- package/dist/engine/batch1_manifest.d.ts +61 -0
- package/dist/engine/batch1_manifest.d.ts.map +1 -0
- package/dist/engine/batch1_manifest.js +220 -0
- package/dist/engine/batch1_manifest.js.map +1 -0
- package/dist/engine/batch1_reality_gate.d.ts +40 -0
- package/dist/engine/batch1_reality_gate.d.ts.map +1 -0
- package/dist/engine/batch1_reality_gate.js +290 -0
- package/dist/engine/batch1_reality_gate.js.map +1 -0
- package/dist/engine/batch1_scenario_registry.d.ts +62 -0
- package/dist/engine/batch1_scenario_registry.d.ts.map +1 -0
- package/dist/engine/batch1_scenario_registry.js +392 -0
- package/dist/engine/batch1_scenario_registry.js.map +1 -0
- package/dist/engine/batch1_scenario_runners.d.ts +42 -0
- package/dist/engine/batch1_scenario_runners.d.ts.map +1 -0
- package/dist/engine/batch1_scenario_runners.js +292 -0
- package/dist/engine/batch1_scenario_runners.js.map +1 -0
- package/dist/engine/capability_action_advisor.d.ts +3 -0
- package/dist/engine/capability_action_advisor.d.ts.map +1 -1
- package/dist/engine/capability_action_advisor.js +10 -0
- package/dist/engine/capability_action_advisor.js.map +1 -1
- package/dist/engine/capability_registry.d.ts +21 -0
- package/dist/engine/capability_registry.d.ts.map +1 -1
- package/dist/engine/capability_registry.js +113 -0
- package/dist/engine/capability_registry.js.map +1 -1
- package/dist/engine/capability_state_store.d.ts +63 -0
- package/dist/engine/capability_state_store.d.ts.map +1 -1
- package/dist/engine/capability_state_store.js +49 -1
- package/dist/engine/capability_state_store.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +5 -4
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/classifier.d.ts +15 -5
- package/dist/engine/classifier.d.ts.map +1 -1
- package/dist/engine/classifier.js +70 -69
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/code_reviewer.d.ts +14 -0
- package/dist/engine/code_reviewer.d.ts.map +1 -1
- package/dist/engine/code_reviewer.js +109 -10
- package/dist/engine/code_reviewer.js.map +1 -1
- package/dist/engine/cognitive_anchor.d.ts +14 -0
- package/dist/engine/cognitive_anchor.d.ts.map +1 -1
- package/dist/engine/cognitive_anchor.js +26 -2
- package/dist/engine/cognitive_anchor.js.map +1 -1
- package/dist/engine/command_execution_contract.d.ts +226 -0
- package/dist/engine/command_execution_contract.d.ts.map +1 -0
- package/dist/engine/command_execution_contract.js +571 -0
- package/dist/engine/command_execution_contract.js.map +1 -0
- package/dist/engine/confidence_scorer.d.ts.map +1 -1
- package/dist/engine/confidence_scorer.js +1 -0
- package/dist/engine/confidence_scorer.js.map +1 -1
- package/dist/engine/config_precedence_contract.d.ts +269 -0
- package/dist/engine/config_precedence_contract.d.ts.map +1 -0
- package/dist/engine/config_precedence_contract.js +948 -0
- package/dist/engine/config_precedence_contract.js.map +1 -0
- package/dist/engine/conflict_gate.d.ts +13 -0
- package/dist/engine/conflict_gate.d.ts.map +1 -1
- package/dist/engine/conflict_gate.js +20 -2
- package/dist/engine/conflict_gate.js.map +1 -1
- package/dist/engine/consumable_asset_registry.d.ts +46 -0
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -0
- package/dist/engine/consumable_asset_registry.js +758 -0
- package/dist/engine/consumable_asset_registry.js.map +1 -0
- package/dist/engine/contract_guard.d.ts +4 -0
- package/dist/engine/contract_guard.d.ts.map +1 -1
- package/dist/engine/contract_guard.js +15 -7
- package/dist/engine/contract_guard.js.map +1 -1
- package/dist/engine/convention_detector.d.ts.map +1 -1
- package/dist/engine/convention_detector.js +5 -2
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/core_engineering_principles.d.ts +155 -0
- package/dist/engine/core_engineering_principles.d.ts.map +1 -0
- package/dist/engine/core_engineering_principles.js +426 -0
- package/dist/engine/core_engineering_principles.js.map +1 -0
- package/dist/engine/debt_reporter.d.ts.map +1 -1
- package/dist/engine/debt_reporter.js +3 -1
- package/dist/engine/debt_reporter.js.map +1 -1
- package/dist/engine/debt_tracker.d.ts.map +1 -1
- package/dist/engine/debt_tracker.js +9 -3
- package/dist/engine/debt_tracker.js.map +1 -1
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/debugger.js +2 -0
- package/dist/engine/debugger.js.map +1 -1
- package/dist/engine/decision_contract.d.ts +11 -2
- package/dist/engine/decision_contract.d.ts.map +1 -1
- package/dist/engine/decision_contract.js +17 -2
- package/dist/engine/decision_contract.js.map +1 -1
- package/dist/engine/delivery.d.ts +7 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +89 -36
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/dependency_scanner.js +14 -9
- package/dist/engine/dependency_scanner.js.map +1 -1
- package/dist/engine/developer_sovereignty.d.ts.map +1 -1
- package/dist/engine/developer_sovereignty.js +8 -2
- package/dist/engine/developer_sovereignty.js.map +1 -1
- package/dist/engine/diff_ownership.d.ts.map +1 -1
- package/dist/engine/diff_ownership.js +8 -0
- package/dist/engine/diff_ownership.js.map +1 -1
- package/dist/engine/diff_ownership_store.d.ts +26 -10
- package/dist/engine/diff_ownership_store.d.ts.map +1 -1
- package/dist/engine/diff_ownership_store.js +47 -20
- package/dist/engine/diff_ownership_store.js.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts +66 -0
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -0
- package/dist/engine/dual_layer_mechanism_registry.js +1077 -0
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -0
- package/dist/engine/escape_report.d.ts +50 -0
- package/dist/engine/escape_report.d.ts.map +1 -1
- package/dist/engine/escape_report.js +38 -0
- package/dist/engine/escape_report.js.map +1 -1
- package/dist/engine/evolver.d.ts.map +1 -1
- package/dist/engine/evolver.js +12 -2
- package/dist/engine/evolver.js.map +1 -1
- package/dist/engine/exploration.d.ts.map +1 -1
- package/dist/engine/exploration.js +87 -0
- package/dist/engine/exploration.js.map +1 -1
- package/dist/engine/failure_classifier.d.ts.map +1 -1
- package/dist/engine/failure_classifier.js +8 -0
- package/dist/engine/failure_classifier.js.map +1 -1
- package/dist/engine/feasibility_checker.d.ts +8 -0
- package/dist/engine/feasibility_checker.d.ts.map +1 -1
- package/dist/engine/feasibility_checker.js +12 -0
- package/dist/engine/feasibility_checker.js.map +1 -1
- package/dist/engine/git_deps.d.ts +4 -1
- package/dist/engine/git_deps.d.ts.map +1 -1
- package/dist/engine/git_deps.js +5 -1
- package/dist/engine/git_deps.js.map +1 -1
- package/dist/engine/governance_report.d.ts +57 -1
- package/dist/engine/governance_report.d.ts.map +1 -1
- package/dist/engine/governance_report.js +91 -1
- package/dist/engine/governance_report.js.map +1 -1
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js +5 -1
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts +105 -0
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -0
- package/dist/engine/implementation_roadmap_registry.js +813 -0
- package/dist/engine/implementation_roadmap_registry.js.map +1 -0
- package/dist/engine/input_material_contract_registry.d.ts +185 -0
- package/dist/engine/input_material_contract_registry.d.ts.map +1 -0
- package/dist/engine/input_material_contract_registry.js +563 -0
- package/dist/engine/input_material_contract_registry.js.map +1 -0
- package/dist/engine/intent_expander.d.ts +8 -27
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +1170 -139
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/intent_router.d.ts +82 -0
- package/dist/engine/intent_router.d.ts.map +1 -0
- package/dist/engine/intent_router.js +458 -0
- package/dist/engine/intent_router.js.map +1 -0
- package/dist/engine/io_controller.d.ts.map +1 -1
- package/dist/engine/io_controller.js +25 -13
- package/dist/engine/io_controller.js.map +1 -1
- package/dist/engine/java_quality_guard.d.ts.map +1 -1
- package/dist/engine/java_quality_guard.js +8 -4
- package/dist/engine/java_quality_guard.js.map +1 -1
- package/dist/engine/job_manager.d.ts +35 -0
- package/dist/engine/job_manager.d.ts.map +1 -1
- package/dist/engine/job_manager.js +53 -9
- package/dist/engine/job_manager.js.map +1 -1
- package/dist/engine/knowledge_config_loader.d.ts +12 -1
- package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
- package/dist/engine/knowledge_config_loader.js +50 -10
- package/dist/engine/knowledge_config_loader.js.map +1 -1
- package/dist/engine/knowledge_injection_boundary.d.ts +56 -0
- package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -0
- package/dist/engine/knowledge_injection_boundary.js +561 -0
- package/dist/engine/knowledge_injection_boundary.js.map +1 -0
- package/dist/engine/knowledge_manager.d.ts +73 -0
- package/dist/engine/knowledge_manager.d.ts.map +1 -1
- package/dist/engine/knowledge_manager.js +163 -21
- package/dist/engine/knowledge_manager.js.map +1 -1
- package/dist/engine/knowledge_sovereignty.d.ts +1 -0
- package/dist/engine/knowledge_sovereignty.d.ts.map +1 -1
- package/dist/engine/knowledge_sovereignty.js +8 -3
- package/dist/engine/knowledge_sovereignty.js.map +1 -1
- package/dist/engine/llm_gateway.d.ts +74 -3
- package/dist/engine/llm_gateway.d.ts.map +1 -1
- package/dist/engine/llm_gateway.js +75 -4
- package/dist/engine/llm_gateway.js.map +1 -1
- package/dist/engine/main_path_integration_contract.d.ts +383 -0
- package/dist/engine/main_path_integration_contract.d.ts.map +1 -0
- package/dist/engine/main_path_integration_contract.js +1581 -0
- package/dist/engine/main_path_integration_contract.js.map +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts +59 -0
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -0
- package/dist/engine/mechanism_contract_registry.js +484 -0
- package/dist/engine/mechanism_contract_registry.js.map +1 -0
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/migration_guard.js +24 -15
- package/dist/engine/migration_guard.js.map +1 -1
- package/dist/engine/mutation_audit.d.ts +10 -0
- package/dist/engine/mutation_audit.d.ts.map +1 -1
- package/dist/engine/mutation_audit.js +19 -2
- package/dist/engine/mutation_audit.js.map +1 -1
- package/dist/engine/observability.d.ts.map +1 -1
- package/dist/engine/observability.js +17 -6
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +20 -4
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/policy_drift_detector.d.ts +6 -0
- package/dist/engine/policy_drift_detector.d.ts.map +1 -1
- package/dist/engine/policy_drift_detector.js +16 -0
- package/dist/engine/policy_drift_detector.js.map +1 -1
- package/dist/engine/privacy_secret_contract.d.ts +320 -0
- package/dist/engine/privacy_secret_contract.d.ts.map +1 -0
- package/dist/engine/privacy_secret_contract.js +874 -0
- package/dist/engine/privacy_secret_contract.js.map +1 -0
- package/dist/engine/regression_matrix.d.ts +21 -8
- package/dist/engine/regression_matrix.d.ts.map +1 -1
- package/dist/engine/regression_matrix.js +37 -8
- package/dist/engine/regression_matrix.js.map +1 -1
- package/dist/engine/risk_sampler.d.ts +6 -0
- package/dist/engine/risk_sampler.d.ts.map +1 -1
- package/dist/engine/risk_sampler.js +9 -0
- package/dist/engine/risk_sampler.js.map +1 -1
- package/dist/engine/runtime_safety.d.ts.map +1 -1
- package/dist/engine/runtime_safety.js +7 -3
- package/dist/engine/runtime_safety.js.map +1 -1
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scaffolder.js +7 -1
- package/dist/engine/scaffolder.js.map +1 -1
- package/dist/engine/scope_controller.d.ts.map +1 -1
- package/dist/engine/scope_controller.js +12 -1
- package/dist/engine/scope_controller.js.map +1 -1
- package/dist/engine/scope_lease.d.ts +43 -0
- package/dist/engine/scope_lease.d.ts.map +1 -1
- package/dist/engine/scope_lease.js +44 -0
- package/dist/engine/scope_lease.js.map +1 -1
- package/dist/engine/semantic_evidence.d.ts +6 -0
- package/dist/engine/semantic_evidence.d.ts.map +1 -1
- package/dist/engine/semantic_evidence.js +9 -0
- package/dist/engine/semantic_evidence.js.map +1 -1
- package/dist/engine/task_context.d.ts +36 -1
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +252 -13
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/task_planner.d.ts.map +1 -1
- package/dist/engine/task_planner.js +13 -3
- package/dist/engine/task_planner.js.map +1 -1
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js +8 -7
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/template_mechanism_auditor.d.ts +93 -0
- package/dist/engine/template_mechanism_auditor.d.ts.map +1 -0
- package/dist/engine/template_mechanism_auditor.js +622 -0
- package/dist/engine/template_mechanism_auditor.js.map +1 -0
- package/dist/engine/test_generator.d.ts.map +1 -1
- package/dist/engine/test_generator.js +6 -0
- package/dist/engine/test_generator.js.map +1 -1
- package/dist/engine/test_quality.d.ts +6 -0
- package/dist/engine/test_quality.d.ts.map +1 -1
- package/dist/engine/test_quality.js +26 -10
- package/dist/engine/test_quality.js.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.d.ts +136 -0
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -0
- package/dist/engine/tool_invocation_contract_registry.js +731 -0
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -0
- package/dist/engine/traceability.d.ts +3 -0
- package/dist/engine/traceability.d.ts.map +1 -1
- package/dist/engine/traceability.js +12 -4
- package/dist/engine/traceability.js.map +1 -1
- package/dist/engine/user_feedback_contract.d.ts +162 -0
- package/dist/engine/user_feedback_contract.d.ts.map +1 -0
- package/dist/engine/user_feedback_contract.js +356 -0
- package/dist/engine/user_feedback_contract.js.map +1 -0
- package/dist/engine/verifier.d.ts +6 -1
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +114 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workflow_contract_registry.d.ts +70 -0
- package/dist/engine/workflow_contract_registry.d.ts.map +1 -0
- package/dist/engine/workflow_contract_registry.js +501 -0
- package/dist/engine/workflow_contract_registry.js.map +1 -0
- package/dist/engine/workspace_resumer.d.ts.map +1 -1
- package/dist/engine/workspace_resumer.js +8 -0
- package/dist/engine/workspace_resumer.js.map +1 -1
- package/dist/engine/zero_config_init.d.ts +67 -2
- package/dist/engine/zero_config_init.d.ts.map +1 -1
- package/dist/engine/zero_config_init.js +410 -28
- package/dist/engine/zero_config_init.js.map +1 -1
- package/dist/git/operations.d.ts +101 -0
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +125 -9
- package/dist/git/operations.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +16 -5
- package/dist/index.js.map +1 -1
- package/dist/knowledge/conflict_detector.d.ts +6 -0
- package/dist/knowledge/conflict_detector.d.ts.map +1 -1
- package/dist/knowledge/conflict_detector.js +7 -0
- package/dist/knowledge/conflict_detector.js.map +1 -1
- package/dist/knowledge/health_checker.d.ts +16 -0
- package/dist/knowledge/health_checker.d.ts.map +1 -1
- package/dist/knowledge/health_checker.js +24 -1
- package/dist/knowledge/health_checker.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +140 -2
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +186 -26
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts +8 -1
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +56 -2
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/writer.d.ts +49 -1
- package/dist/knowledge/writer.d.ts.map +1 -1
- package/dist/knowledge/writer.js +55 -1
- package/dist/knowledge/writer.js.map +1 -1
- package/dist/types.d.ts +255 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +29 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +7 -7
- package/templates/knowledge/checklists//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +16 -0
- package/templates/knowledge/checklists//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md +17 -0
- package/templates/knowledge/checklists//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/351/252/214/346/224/266/346/270/205/345/215/225.md +43 -0
- package/templates/knowledge/checklists//347/237/245/350/257/206/346/263/250/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +17 -0
- package/templates/knowledge/checklists//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md +15 -0
- package/templates/knowledge/checklists//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md +16 -0
- package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +1 -0
- package/templates/knowledge/procedures//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/350/257/201/346/265/201/347/250/213.md +23 -0
- package/templates/knowledge/procedures//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md +19 -0
- package/templates/knowledge/procedures//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md +15 -0
- package/templates/knowledge/procedures//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md +15 -0
- package/templates/knowledge/procedures//346/272/220/347/240/201/345/216/237/345/236/213/344/272/244/344/273/230/346/265/201/347/250/213.md +1 -1
- package/templates/knowledge/procedures//347/274/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md +53 -0
- package/templates/knowledge/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md +21 -0
- package/templates/knowledge/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md +25 -0
- package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md +20 -0
- package/templates/knowledge/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md +25 -0
- package/templates/knowledge/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md +26 -0
- package/templates/knowledge/rules//346/211/247/350/241/214/345/256/210/345/215/253/350/257/204/344/274/260/350/247/204/345/210/231.md +24 -0
- package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/345/244/204/347/220/206/350/247/204/345/210/231.md +20 -0
- package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +125 -0
- package/templates/knowledge/rules//346/263/250/345/206/214/350/241/250/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/345/210/231.md +26 -0
- package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +22 -0
- package/templates/knowledge/rules//347/237/245/350/257/206/346/263/250/345/205/245/350/276/271/347/225/214/350/247/204/345/210/231.md +25 -0
- package/templates/knowledge/rules//350/276/223/345/205/245/346/235/220/346/226/231/345/245/221/347/272/246/350/247/204/345/210/231.md +27 -0
- package/templates/knowledge/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md +22 -0
- package/templates/knowledge/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md +24 -0
- package/templates/knowledge/rules//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226/350/247/204/345/210/231.md +28 -0
- package/templates/knowledge/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md +25 -0
- package/templates/knowledge/templates/{review_summary.md → /345/256/241/346/237/245/346/221/230/350/246/201.md} +1 -1
- package/templates/config.yaml +0 -53
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
import type { KnowledgeIndexManager } from "../knowledge/index_manager.js";
|
|
2
2
|
import type { ProjectConfig, KnowledgeEntry } from "../types.js";
|
|
3
|
+
/** 审计发现项 */
|
|
3
4
|
export interface AuditFinding {
|
|
5
|
+
/** 发现项 ID */
|
|
4
6
|
id: string;
|
|
7
|
+
/** 严重程度 */
|
|
5
8
|
severity: "info" | "warning" | "critical";
|
|
9
|
+
/** 问题类别: stale=陈旧, duplicate=重复, format=格式, coverage=覆盖, completeness=完整度, design_drift=设计漂移 */
|
|
6
10
|
category: "stale" | "duplicate" | "format" | "coverage" | "completeness" | "design_drift";
|
|
11
|
+
/** 关联的知识条目名称 */
|
|
7
12
|
entry_name: string;
|
|
13
|
+
/** 问题描述 */
|
|
8
14
|
message: string;
|
|
15
|
+
/** 修复建议 */
|
|
9
16
|
suggestion: string;
|
|
10
17
|
}
|
|
18
|
+
/** 审计结果 */
|
|
11
19
|
export interface AuditResult {
|
|
20
|
+
/** 非废弃状态的条目总数 */
|
|
12
21
|
total_entries: number;
|
|
22
|
+
/** 审计发现列表 */
|
|
13
23
|
findings: AuditFinding[];
|
|
24
|
+
/** 各类别发现数量统计 */
|
|
14
25
|
summary: {
|
|
15
26
|
stale: number;
|
|
16
27
|
duplicate: number;
|
|
@@ -19,58 +30,120 @@ export interface AuditResult {
|
|
|
19
30
|
completeness: number;
|
|
20
31
|
design_drift: number;
|
|
21
32
|
};
|
|
33
|
+
/** 审计时间 */
|
|
22
34
|
audited_at: string;
|
|
23
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* 审计知识库健康度。
|
|
38
|
+
* 检查五个维度: 陈旧条目、重复触发词、格式规范、类型覆盖、内容完整度。
|
|
39
|
+
* @param knowledgeIndex - 知识索引管理器
|
|
40
|
+
* @param config - 项目配置
|
|
41
|
+
* @returns 审计结果,包含发现项和统计摘要
|
|
42
|
+
*/
|
|
24
43
|
export declare function auditKnowledge(knowledgeIndex: KnowledgeIndexManager, config: ProjectConfig): Promise<AuditResult>;
|
|
44
|
+
/** 新增知识条目的输入参数 */
|
|
25
45
|
export interface AddKnowledgeInput {
|
|
46
|
+
/** 知识条目标题 */
|
|
26
47
|
title: string;
|
|
48
|
+
/** 知识条目类型 */
|
|
27
49
|
type: KnowledgeEntry["type"];
|
|
50
|
+
/** 作用域列表 */
|
|
28
51
|
scope: string[];
|
|
52
|
+
/** 触发条件描述 */
|
|
29
53
|
when_triggers: string;
|
|
54
|
+
/** 决策规则(可选) */
|
|
30
55
|
decision_rules?: string;
|
|
56
|
+
/** 是否保存为草稿(默认 true) */
|
|
31
57
|
save_to_drafts?: boolean;
|
|
58
|
+
/** 是否自动丰富内容(默认 true) */
|
|
32
59
|
auto_enrich?: boolean;
|
|
33
60
|
}
|
|
61
|
+
/** 自动丰富指南的步骤 */
|
|
34
62
|
export interface EnrichmentStep {
|
|
63
|
+
/** 步骤编号 */
|
|
35
64
|
step_number: number;
|
|
65
|
+
/** 步骤描述 */
|
|
36
66
|
action: string;
|
|
67
|
+
/** 搜索查询关键词 */
|
|
37
68
|
search_queries?: string[];
|
|
69
|
+
/** 关注领域 */
|
|
38
70
|
focus_areas: string[];
|
|
39
71
|
}
|
|
72
|
+
/** 自动丰富指南 */
|
|
40
73
|
export interface EnrichmentGuide {
|
|
74
|
+
/** 关联的知识条目名称 */
|
|
41
75
|
entry_name: string;
|
|
76
|
+
/** 知识类型 */
|
|
42
77
|
type: KnowledgeEntry["type"];
|
|
78
|
+
/** 概述 */
|
|
43
79
|
overview: string;
|
|
80
|
+
/** 丰富步骤列表 */
|
|
44
81
|
steps: EnrichmentStep[];
|
|
82
|
+
/** 权威来源列表 */
|
|
45
83
|
authoritative_sources: string[];
|
|
84
|
+
/** 完整度阈值要求 */
|
|
46
85
|
completeness_thresholds: Array<{
|
|
47
86
|
field: string;
|
|
48
87
|
minimum: number;
|
|
49
88
|
}>;
|
|
89
|
+
/** 更新调用模板 */
|
|
50
90
|
update_call_template: string;
|
|
51
91
|
}
|
|
92
|
+
/** 新增知识条目的结果 */
|
|
52
93
|
export interface AddKnowledgeResult {
|
|
94
|
+
/** 是否成功 */
|
|
53
95
|
success: boolean;
|
|
96
|
+
/** 文件路径 */
|
|
54
97
|
file_path: string;
|
|
98
|
+
/** 是否为草稿 */
|
|
55
99
|
is_draft: boolean;
|
|
100
|
+
/** 结果消息 */
|
|
56
101
|
message: string;
|
|
102
|
+
/** 自动丰富指南(可选) */
|
|
57
103
|
enrichment_guide?: EnrichmentGuide;
|
|
58
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* 新增知识条目。
|
|
107
|
+
* 根据类型生成对应的模板内容,保存到草稿目录或正式目录。
|
|
108
|
+
* @param input - 新增知识条目输入
|
|
109
|
+
* @param config - 项目配置
|
|
110
|
+
* @returns 新增结果,包含文件路径和消息
|
|
111
|
+
*/
|
|
59
112
|
export declare function addKnowledge(input: AddKnowledgeInput, config: ProjectConfig): Promise<AddKnowledgeResult>;
|
|
113
|
+
/** 更新知识条目的输入参数 */
|
|
60
114
|
export interface UpdateKnowledgeInput {
|
|
115
|
+
/** 知识条目名称 */
|
|
61
116
|
entry_name: string;
|
|
117
|
+
/** 更新内容 */
|
|
62
118
|
updates: {
|
|
119
|
+
/** 更新触发条件 */
|
|
63
120
|
when_triggers?: string;
|
|
121
|
+
/** 新增决策规则 */
|
|
64
122
|
add_decision_rules?: string[];
|
|
123
|
+
/** 新增验收标准 */
|
|
65
124
|
add_acceptance_criteria?: string[];
|
|
125
|
+
/** 更新状态 */
|
|
66
126
|
status?: KnowledgeEntry["status"];
|
|
67
127
|
};
|
|
68
128
|
}
|
|
129
|
+
/** 更新知识条目的结果 */
|
|
69
130
|
export interface UpdateKnowledgeResult {
|
|
131
|
+
/** 是否成功 */
|
|
70
132
|
success: boolean;
|
|
133
|
+
/** 文件路径 */
|
|
71
134
|
file_path: string;
|
|
135
|
+
/** 备份路径 */
|
|
72
136
|
backup_path: string;
|
|
137
|
+
/** 结果消息 */
|
|
73
138
|
message: string;
|
|
74
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* 更新已有的知识条目。
|
|
142
|
+
* 更新前自动创建备份,支持修改触发条件、状态、决策规则和验收标准。
|
|
143
|
+
* @param input - 更新输入参数
|
|
144
|
+
* @param knowledgeIndex - 知识索引管理器
|
|
145
|
+
* @param config - 项目配置
|
|
146
|
+
* @returns 更新结果,包含文件路径和备份路径
|
|
147
|
+
*/
|
|
75
148
|
export declare function updateKnowledge(input: UpdateKnowledgeInput, knowledgeIndex: KnowledgeIndexManager, config: ProjectConfig): Promise<UpdateKnowledgeResult>;
|
|
76
149
|
//# sourceMappingURL=knowledge_manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge_manager.d.ts","sourceRoot":"","sources":["../../src/engine/knowledge_manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIjE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IAC1C,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,cAAc,CAAC;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAClC,cAAc,EAAE,qBAAqB,EACrC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"knowledge_manager.d.ts","sourceRoot":"","sources":["../../src/engine/knowledge_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,13 +3,21 @@ import fss from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import matter from "gray-matter";
|
|
5
5
|
import { KnowledgeWriter } from "../knowledge/writer.js";
|
|
6
|
+
/**
|
|
7
|
+
* 审计知识库健康度。
|
|
8
|
+
* 检查五个维度: 陈旧条目、重复触发词、格式规范、类型覆盖、内容完整度。
|
|
9
|
+
* @param knowledgeIndex - 知识索引管理器
|
|
10
|
+
* @param config - 项目配置
|
|
11
|
+
* @returns 审计结果,包含发现项和统计摘要
|
|
12
|
+
*/
|
|
6
13
|
export async function auditKnowledge(knowledgeIndex, config) {
|
|
14
|
+
console.error("[soloForge] 知识审计: 开始审计知识库健康度");
|
|
7
15
|
const { global: globalEntries, project: projectEntries } = knowledgeIndex.getAllEntries();
|
|
8
16
|
const all = [...globalEntries, ...projectEntries];
|
|
9
17
|
const findings = [];
|
|
10
18
|
const now = Date.now();
|
|
11
19
|
let findingId = 0;
|
|
12
|
-
// 1.
|
|
20
|
+
// 1. 陈旧条目: 超过 90 天未使用或从未被匹配
|
|
13
21
|
for (const entry of all) {
|
|
14
22
|
if (entry.status === "deprecated")
|
|
15
23
|
continue;
|
|
@@ -37,7 +45,7 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
37
45
|
}
|
|
38
46
|
}
|
|
39
47
|
}
|
|
40
|
-
// 2.
|
|
48
|
+
// 2. 重复检查: 相似触发词
|
|
41
49
|
for (let i = 0; i < all.length; i++) {
|
|
42
50
|
for (let j = i + 1; j < all.length; j++) {
|
|
43
51
|
if (all[i].type !== all[j].type)
|
|
@@ -55,7 +63,7 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
55
63
|
}
|
|
56
64
|
}
|
|
57
65
|
}
|
|
58
|
-
// 3.
|
|
66
|
+
// 3. 格式检查: 缺失必需的 frontmatter 字段 + Schema 验证
|
|
59
67
|
for (const entry of all) {
|
|
60
68
|
if (entry.status === "deprecated")
|
|
61
69
|
continue;
|
|
@@ -76,7 +84,7 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
76
84
|
suggestion: `补充 ${issues.join("、")} 字段`,
|
|
77
85
|
});
|
|
78
86
|
}
|
|
79
|
-
// 3b. Schema
|
|
87
|
+
// 3b. Schema 验证: 读取原始文件进行深度检查
|
|
80
88
|
const schemaIssues = await validateFormatSchema(entry);
|
|
81
89
|
for (const issue of schemaIssues) {
|
|
82
90
|
findings.push({
|
|
@@ -89,7 +97,7 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
89
97
|
});
|
|
90
98
|
}
|
|
91
99
|
}
|
|
92
|
-
// 4.
|
|
100
|
+
// 4. 覆盖度检查: 确保各知识类型都有条目
|
|
93
101
|
const requiredTypes = ["pattern", "procedure", "domain", "review_rule"];
|
|
94
102
|
for (const type of requiredTypes) {
|
|
95
103
|
const count = all.filter((e) => e.type === type && e.status !== "deprecated").length;
|
|
@@ -104,7 +112,7 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
104
112
|
});
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
|
-
// 5.
|
|
115
|
+
// 5. 完整度检查: 检查规则/验收项数量是否达到类型阈值
|
|
108
116
|
for (const entry of all) {
|
|
109
117
|
if (entry.status === "deprecated")
|
|
110
118
|
continue;
|
|
@@ -143,6 +151,7 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
143
151
|
completeness: findings.filter((f) => f.category === "completeness").length,
|
|
144
152
|
design_drift: 0,
|
|
145
153
|
};
|
|
154
|
+
console.error(`[soloForge] 知识审计: 完成,共 ${findings.length} 项发现`);
|
|
146
155
|
return {
|
|
147
156
|
total_entries: all.filter((e) => e.status !== "deprecated").length,
|
|
148
157
|
findings,
|
|
@@ -150,19 +159,27 @@ export async function auditKnowledge(knowledgeIndex, config) {
|
|
|
150
159
|
audited_at: new Date().toISOString(),
|
|
151
160
|
};
|
|
152
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* 新增知识条目。
|
|
164
|
+
* 根据类型生成对应的模板内容,保存到草稿目录或正式目录。
|
|
165
|
+
* @param input - 新增知识条目输入
|
|
166
|
+
* @param config - 项目配置
|
|
167
|
+
* @returns 新增结果,包含文件路径和消息
|
|
168
|
+
*/
|
|
153
169
|
export async function addKnowledge(input, config) {
|
|
170
|
+
console.error(`[soloForge] 知识管理: 新增知识条目「${input.title}」[${input.type}]`);
|
|
154
171
|
const knowledgeDir = getProjectKnowledgeDir(config);
|
|
155
|
-
const fileName = `${input.title}.md`;
|
|
156
|
-
//
|
|
172
|
+
const fileName = `${path.basename(input.title)}.md`; // basename 防止路径穿越
|
|
173
|
+
// 确定保存位置
|
|
157
174
|
const typeDir = getTypeDirectory(input.type);
|
|
158
175
|
const draftsDir = path.join(knowledgeDir, "drafts");
|
|
159
176
|
const targetDir = input.save_to_drafts !== false
|
|
160
177
|
? draftsDir
|
|
161
178
|
: path.join(knowledgeDir, typeDir);
|
|
162
|
-
//
|
|
179
|
+
// 确保目录存在
|
|
163
180
|
await fs.mkdir(targetDir, { recursive: true });
|
|
164
181
|
const filePath = path.join(targetDir, fileName);
|
|
165
|
-
//
|
|
182
|
+
// 检查文件是否已存在
|
|
166
183
|
if (fss.existsSync(filePath)) {
|
|
167
184
|
return {
|
|
168
185
|
success: false,
|
|
@@ -171,12 +188,13 @@ export async function addKnowledge(input, config) {
|
|
|
171
188
|
message: `文件已存在: ${filePath},请使用 sf_knowledge_update 更新`,
|
|
172
189
|
};
|
|
173
190
|
}
|
|
174
|
-
//
|
|
191
|
+
// 生成内容
|
|
175
192
|
const content = generateKnowledgeContent(input);
|
|
176
193
|
await fs.writeFile(filePath, content, "utf-8");
|
|
177
194
|
const enrichment_guide = input.auto_enrich !== false
|
|
178
195
|
? buildEnrichmentGuide(input)
|
|
179
196
|
: undefined;
|
|
197
|
+
console.error(`[soloForge] 知识管理: 知识条目已保存到 ${filePath}`);
|
|
180
198
|
return {
|
|
181
199
|
success: true,
|
|
182
200
|
file_path: filePath,
|
|
@@ -187,11 +205,21 @@ export async function addKnowledge(input, config) {
|
|
|
187
205
|
enrichment_guide,
|
|
188
206
|
};
|
|
189
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* 更新已有的知识条目。
|
|
210
|
+
* 更新前自动创建备份,支持修改触发条件、状态、决策规则和验收标准。
|
|
211
|
+
* @param input - 更新输入参数
|
|
212
|
+
* @param knowledgeIndex - 知识索引管理器
|
|
213
|
+
* @param config - 项目配置
|
|
214
|
+
* @returns 更新结果,包含文件路径和备份路径
|
|
215
|
+
*/
|
|
190
216
|
export async function updateKnowledge(input, knowledgeIndex, config) {
|
|
217
|
+
console.error(`[soloForge] 知识管理: 更新知识条目「${input.entry_name}」`);
|
|
191
218
|
const entry = knowledgeIndex.getEntry(input.entry_name)
|
|
192
219
|
?? knowledgeIndex.getAllEntries().global.find((e) => e.name === input.entry_name)
|
|
193
220
|
?? knowledgeIndex.getAllEntries().project.find((e) => e.name === input.entry_name);
|
|
194
221
|
if (!entry) {
|
|
222
|
+
console.error(`[soloForge] 知识管理: 未找到知识条目「${input.entry_name}」`);
|
|
195
223
|
return {
|
|
196
224
|
success: false,
|
|
197
225
|
file_path: "",
|
|
@@ -202,6 +230,7 @@ export async function updateKnowledge(input, knowledgeIndex, config) {
|
|
|
202
230
|
const filePath = entry.file_path;
|
|
203
231
|
// 维度6: 知识目录隔离 — 禁止更新 core/ 只读目录中的条目
|
|
204
232
|
if (KnowledgeWriter.isCorePath(filePath)) {
|
|
233
|
+
console.error(`[soloForge] 知识管理: 「${input.entry_name}」位于 core/ 只读目录,禁止自动更新`);
|
|
205
234
|
return {
|
|
206
235
|
success: false,
|
|
207
236
|
file_path: filePath,
|
|
@@ -217,15 +246,15 @@ export async function updateKnowledge(input, knowledgeIndex, config) {
|
|
|
217
246
|
message: `文件不存在: ${filePath}`,
|
|
218
247
|
};
|
|
219
248
|
}
|
|
220
|
-
//
|
|
249
|
+
// 读取并解析文件
|
|
221
250
|
const raw = await fs.readFile(filePath, "utf-8");
|
|
222
251
|
const { data: frontmatter, content: body } = matter(raw);
|
|
223
|
-
//
|
|
252
|
+
// 创建备份
|
|
224
253
|
const backupDir = path.join(path.dirname(filePath), ".backups");
|
|
225
254
|
await fs.mkdir(backupDir, { recursive: true });
|
|
226
255
|
const backupPath = path.join(backupDir, `${entry.name}-${Date.now()}.md`);
|
|
227
256
|
await fs.writeFile(backupPath, raw, "utf-8");
|
|
228
|
-
//
|
|
257
|
+
// 应用更新
|
|
229
258
|
let updated = false;
|
|
230
259
|
if (input.updates.when_triggers) {
|
|
231
260
|
frontmatter.when = input.updates.when_triggers;
|
|
@@ -268,9 +297,10 @@ export async function updateKnowledge(input, knowledgeIndex, config) {
|
|
|
268
297
|
message: "未提供任何更新内容",
|
|
269
298
|
};
|
|
270
299
|
}
|
|
271
|
-
//
|
|
300
|
+
// 写入更新后的文件
|
|
272
301
|
const output = matter.stringify(newBody, frontmatter);
|
|
273
302
|
await fs.writeFile(filePath, output, "utf-8");
|
|
303
|
+
console.error(`[soloForge] 知识管理: 知识条目「${input.entry_name}」已更新,备份: ${backupPath}`);
|
|
274
304
|
return {
|
|
275
305
|
success: true,
|
|
276
306
|
file_path: filePath,
|
|
@@ -278,8 +308,10 @@ export async function updateKnowledge(input, knowledgeIndex, config) {
|
|
|
278
308
|
message: `知识条目已更新: ${filePath}\n备份: ${backupPath}`,
|
|
279
309
|
};
|
|
280
310
|
}
|
|
281
|
-
// ──
|
|
311
|
+
// ── 格式 Schema ──
|
|
312
|
+
/** 规范的 frontmatter 字段顺序 */
|
|
282
313
|
const CANONICAL_FM_ORDER = ["name", "type", "when", "scope", "products"];
|
|
314
|
+
/** 各知识类型的格式规范定义 */
|
|
283
315
|
const FORMAT_SCHEMA = {
|
|
284
316
|
pattern: {
|
|
285
317
|
required_headings: ["## 决策规则", "## 验收项"],
|
|
@@ -302,6 +334,7 @@ const FORMAT_SCHEMA = {
|
|
|
302
334
|
required_headings: [],
|
|
303
335
|
},
|
|
304
336
|
};
|
|
337
|
+
/** 各知识类型的完整度阈值(字段名、匹配正则、最小数量) */
|
|
305
338
|
const COMPLETENESS_THRESHOLDS = {
|
|
306
339
|
pattern: [
|
|
307
340
|
{ field: "决策规则", pattern: /^- /gm, minimum: 5 },
|
|
@@ -321,9 +354,21 @@ const COMPLETENESS_THRESHOLDS = {
|
|
|
321
354
|
{ field: "规则", pattern: /^## [A-Z]+-\d+/gm, minimum: 5 },
|
|
322
355
|
],
|
|
323
356
|
};
|
|
357
|
+
/**
|
|
358
|
+
* 统计正则匹配数量。
|
|
359
|
+
* @param body - 文本内容
|
|
360
|
+
* @param pattern - 正则表达式
|
|
361
|
+
* @returns 匹配数量
|
|
362
|
+
*/
|
|
324
363
|
function countPattern(body, pattern) {
|
|
325
364
|
return (body.match(pattern) ?? []).length;
|
|
326
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* 验证知识条目的格式 Schema 规范。
|
|
368
|
+
* 检查 frontmatter 字段顺序、when 字段风格、body 必需标题。
|
|
369
|
+
* @param entry - 知识条目
|
|
370
|
+
* @returns 格式问题列表
|
|
371
|
+
*/
|
|
327
372
|
async function validateFormatSchema(entry) {
|
|
328
373
|
const results = [];
|
|
329
374
|
if (!entry.file_path || !fss.existsSync(entry.file_path))
|
|
@@ -336,7 +381,7 @@ async function validateFormatSchema(entry) {
|
|
|
336
381
|
return results;
|
|
337
382
|
}
|
|
338
383
|
const { data: fm, content: body } = matter(raw);
|
|
339
|
-
//
|
|
384
|
+
// 检查 frontmatter 字段顺序
|
|
340
385
|
const fmKeys = Object.keys(fm);
|
|
341
386
|
const orderIssues = [];
|
|
342
387
|
for (let i = 0; i < CANONICAL_FM_ORDER.length; i++) {
|
|
@@ -352,7 +397,7 @@ async function validateFormatSchema(entry) {
|
|
|
352
397
|
suggestion: `标准顺序: ${CANONICAL_FM_ORDER.join(" → ")}`,
|
|
353
398
|
});
|
|
354
399
|
}
|
|
355
|
-
//
|
|
400
|
+
// 检查 when 字段风格: 第一个逗号分隔段应 ≤ 10 个中文字符
|
|
356
401
|
const whenStr = fm.when ?? "";
|
|
357
402
|
const firstSegment = whenStr.split(/[,\s,]/)[0] ?? "";
|
|
358
403
|
const chineseCharCount = (firstSegment.match(/[一-鿿]/g) ?? []).length;
|
|
@@ -362,7 +407,7 @@ async function validateFormatSchema(entry) {
|
|
|
362
407
|
suggestion: "when 应为纯关键词逗号分隔,如: 数据导出, CSV, Excel, 批量导出",
|
|
363
408
|
});
|
|
364
409
|
}
|
|
365
|
-
//
|
|
410
|
+
// 检查 body 标题
|
|
366
411
|
const schema = FORMAT_SCHEMA[entry.type];
|
|
367
412
|
if (schema) {
|
|
368
413
|
for (const heading of schema.required_headings) {
|
|
@@ -386,7 +431,13 @@ async function validateFormatSchema(entry) {
|
|
|
386
431
|
}
|
|
387
432
|
return results;
|
|
388
433
|
}
|
|
389
|
-
// ──
|
|
434
|
+
// ── 辅助函数 ──
|
|
435
|
+
/**
|
|
436
|
+
* 计算两个关键词字符串的重叠度。
|
|
437
|
+
* @param a - 第一个关键词字符串
|
|
438
|
+
* @param b - 第二个关键词字符串
|
|
439
|
+
* @returns 重叠度(0-1),1 表示完全重叠
|
|
440
|
+
*/
|
|
390
441
|
function keywordOverlap(a, b) {
|
|
391
442
|
const wordsA = new Set(a.toLowerCase().split(/[,\s,]+/).filter(Boolean));
|
|
392
443
|
const wordsB = new Set(b.toLowerCase().split(/[,\s,]+/).filter(Boolean));
|
|
@@ -399,6 +450,11 @@ function keywordOverlap(a, b) {
|
|
|
399
450
|
}
|
|
400
451
|
return overlap / Math.min(wordsA.size, wordsB.size);
|
|
401
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* 根据知识类型获取存储目录名。
|
|
455
|
+
* @param type - 知识条目类型
|
|
456
|
+
* @returns 目录名
|
|
457
|
+
*/
|
|
402
458
|
function getTypeDirectory(type) {
|
|
403
459
|
const map = {
|
|
404
460
|
pattern: "patterns/temp",
|
|
@@ -410,6 +466,11 @@ function getTypeDirectory(type) {
|
|
|
410
466
|
};
|
|
411
467
|
return map[type] ?? "procedures";
|
|
412
468
|
}
|
|
469
|
+
/**
|
|
470
|
+
* 生成知识条目的 frontmatter 文本。
|
|
471
|
+
* @param input - 新增知识条目输入
|
|
472
|
+
* @returns frontmatter 文本
|
|
473
|
+
*/
|
|
413
474
|
function generateFrontmatter(input) {
|
|
414
475
|
return `---
|
|
415
476
|
name: ${input.title}
|
|
@@ -419,6 +480,12 @@ scope: [${input.scope.join(", ")}]
|
|
|
419
480
|
products: ["*"]
|
|
420
481
|
---`;
|
|
421
482
|
}
|
|
483
|
+
/**
|
|
484
|
+
* 生成知识条目的完整内容(frontmatter + body)。
|
|
485
|
+
* 根据类型选择对应的 body 生成器。
|
|
486
|
+
* @param input - 新增知识条目输入
|
|
487
|
+
* @returns 完整的 Markdown 文件内容
|
|
488
|
+
*/
|
|
422
489
|
function generateKnowledgeContent(input) {
|
|
423
490
|
const fm = generateFrontmatter(input);
|
|
424
491
|
const generators = {
|
|
@@ -432,6 +499,11 @@ function generateKnowledgeContent(input) {
|
|
|
432
499
|
const gen = generators[input.type] ?? generators.pattern;
|
|
433
500
|
return `${fm}\n\n${gen()}\n`;
|
|
434
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* 生成 pattern 类型知识条目的 body 内容。
|
|
504
|
+
* @param input - 新增知识条目输入
|
|
505
|
+
* @returns body 文本
|
|
506
|
+
*/
|
|
435
507
|
function generatePatternBody(input) {
|
|
436
508
|
const rules = input.decision_rules
|
|
437
509
|
? input.decision_rules.split("\n").filter(Boolean).map((r) => `- ${r}`).join("\n")
|
|
@@ -442,6 +514,11 @@ ${rules}
|
|
|
442
514
|
## 验收项
|
|
443
515
|
- [AC-01] (待补充验收标准)`;
|
|
444
516
|
}
|
|
517
|
+
/**
|
|
518
|
+
* 生成 domain 类型知识条目的 body 内容。
|
|
519
|
+
* @param input - 新增知识条目输入
|
|
520
|
+
* @returns body 文本
|
|
521
|
+
*/
|
|
445
522
|
function generateDomainBody(input) {
|
|
446
523
|
const rules = input.decision_rules
|
|
447
524
|
? input.decision_rules.split("\n").filter(Boolean).map((r) => `${r}`).join("\n\n")
|
|
@@ -458,6 +535,11 @@ ${rules}
|
|
|
458
535
|
## 关联模式
|
|
459
536
|
- (待补充关联模式)`;
|
|
460
537
|
}
|
|
538
|
+
/**
|
|
539
|
+
* 生成 procedure 类型知识条目的 body 内容。
|
|
540
|
+
* @param input - 新增知识条目输入
|
|
541
|
+
* @returns body 文本
|
|
542
|
+
*/
|
|
461
543
|
function generateProcedureBody(input) {
|
|
462
544
|
return `## 适用场景
|
|
463
545
|
(待补充适用场景描述)
|
|
@@ -471,6 +553,11 @@ function generateProcedureBody(input) {
|
|
|
471
553
|
## 注意事项
|
|
472
554
|
- (待补充注意事项)`;
|
|
473
555
|
}
|
|
556
|
+
/**
|
|
557
|
+
* 生成 pipeline_procedure 类型知识条目的 body 内容。
|
|
558
|
+
* @param input - 新增知识条目输入
|
|
559
|
+
* @returns body 文本
|
|
560
|
+
*/
|
|
474
561
|
function generatePipelineBody(input) {
|
|
475
562
|
return `# ${input.title}
|
|
476
563
|
|
|
@@ -483,6 +570,11 @@ function generatePipelineBody(input) {
|
|
|
483
570
|
(待补充阶段描述)
|
|
484
571
|
工具:sf_verify`;
|
|
485
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* 生成 review_rule 类型知识条目的 body 内容。
|
|
575
|
+
* @param input - 新增知识条目输入
|
|
576
|
+
* @returns body 文本
|
|
577
|
+
*/
|
|
486
578
|
function generateReviewRuleBody(input) {
|
|
487
579
|
const code = input.title.toUpperCase().replace(/-/g, "").slice(0, 3);
|
|
488
580
|
return `## ${code}-01: (待补充规则标题)
|
|
@@ -491,6 +583,11 @@ severity: warning
|
|
|
491
583
|
scope: ${input.scope.join(", ")}
|
|
492
584
|
description: (待补充规则描述)`;
|
|
493
585
|
}
|
|
586
|
+
/**
|
|
587
|
+
* 生成 acceptance_template 类型知识条目的 body 内容。
|
|
588
|
+
* @param input - 新增知识条目输入
|
|
589
|
+
* @returns body 文本
|
|
590
|
+
*/
|
|
494
591
|
function generateAcceptanceBody(input) {
|
|
495
592
|
return `# ${input.title}
|
|
496
593
|
|
|
@@ -500,10 +597,20 @@ function generateAcceptanceBody(input) {
|
|
|
500
597
|
## 2. (待补充章节标题)
|
|
501
598
|
(待补充内容)`;
|
|
502
599
|
}
|
|
503
|
-
// ──
|
|
600
|
+
// ── 自动丰富指南 ──
|
|
601
|
+
/**
|
|
602
|
+
* 从标题中提取可读的主题名称。
|
|
603
|
+
* @param title - 知识条目标题(含连字符/下划线)
|
|
604
|
+
* @returns 格式化后的主题名称
|
|
605
|
+
*/
|
|
504
606
|
function extractTopicFromTitle(title) {
|
|
505
607
|
return title.split(/[-_]/).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
|
|
506
608
|
}
|
|
609
|
+
/**
|
|
610
|
+
* 根据知识类型构建对应的自动丰富指南。
|
|
611
|
+
* @param input - 新增知识条目输入
|
|
612
|
+
* @returns 自动丰富指南
|
|
613
|
+
*/
|
|
507
614
|
function buildEnrichmentGuide(input) {
|
|
508
615
|
const builders = {
|
|
509
616
|
pattern: () => buildPatternGuide(input),
|
|
@@ -515,6 +622,11 @@ function buildEnrichmentGuide(input) {
|
|
|
515
622
|
};
|
|
516
623
|
return builders[input.type]();
|
|
517
624
|
}
|
|
625
|
+
/**
|
|
626
|
+
* 构建 pattern 类型的自动丰富指南。
|
|
627
|
+
* @param input - 新增知识条目输入
|
|
628
|
+
* @returns 丰富指南
|
|
629
|
+
*/
|
|
518
630
|
function buildPatternGuide(input) {
|
|
519
631
|
const topic = extractTopicFromTitle(input.title);
|
|
520
632
|
return {
|
|
@@ -559,6 +671,11 @@ function buildPatternGuide(input) {
|
|
|
559
671
|
update_call_template: `sf_knowledge_update(entry_name="${input.title}", add_decision_rules=[规则1, 规则2, ...], add_acceptance_criteria=[标准1, 标准2, ...])`,
|
|
560
672
|
};
|
|
561
673
|
}
|
|
674
|
+
/**
|
|
675
|
+
* 构建 domain 类型的自动丰富指南。
|
|
676
|
+
* @param input - 新增知识条目输入
|
|
677
|
+
* @returns 丰富指南
|
|
678
|
+
*/
|
|
562
679
|
function buildDomainGuide(input) {
|
|
563
680
|
const topic = extractTopicFromTitle(input.title);
|
|
564
681
|
return {
|
|
@@ -609,6 +726,11 @@ function buildDomainGuide(input) {
|
|
|
609
726
|
update_call_template: `sf_knowledge_update(entry_name="${input.title}", add_decision_rules=[业务规则1, 业务规则2, ...])`,
|
|
610
727
|
};
|
|
611
728
|
}
|
|
729
|
+
/**
|
|
730
|
+
* 构建 procedure 类型的自动丰富指南。
|
|
731
|
+
* @param input - 新增知识条目输入
|
|
732
|
+
* @returns 丰富指南
|
|
733
|
+
*/
|
|
612
734
|
function buildProcedureGuide(input) {
|
|
613
735
|
const topic = extractTopicFromTitle(input.title);
|
|
614
736
|
return {
|
|
@@ -657,6 +779,11 @@ function buildProcedureGuide(input) {
|
|
|
657
779
|
update_call_template: `sf_knowledge_update(entry_name="${input.title}", add_decision_rules=[步骤内容, 注意事项, ...])`,
|
|
658
780
|
};
|
|
659
781
|
}
|
|
782
|
+
/**
|
|
783
|
+
* 构建 pipeline_procedure 类型的自动丰富指南。
|
|
784
|
+
* @param input - 新增知识条目输入
|
|
785
|
+
* @returns 丰富指南
|
|
786
|
+
*/
|
|
660
787
|
function buildPipelineGuide(input) {
|
|
661
788
|
const topic = extractTopicFromTitle(input.title);
|
|
662
789
|
return {
|
|
@@ -698,6 +825,11 @@ function buildPipelineGuide(input) {
|
|
|
698
825
|
update_call_template: `sf_knowledge_update(entry_name="${input.title}", add_decision_rules=[阶段定义1, 阶段定义2, ...])`,
|
|
699
826
|
};
|
|
700
827
|
}
|
|
828
|
+
/**
|
|
829
|
+
* 构建 review_rule 类型的自动丰富指南。
|
|
830
|
+
* @param input - 新增知识条目输入
|
|
831
|
+
* @returns 丰富指南
|
|
832
|
+
*/
|
|
701
833
|
function buildReviewRuleGuide(input) {
|
|
702
834
|
const topic = extractTopicFromTitle(input.title);
|
|
703
835
|
return {
|
|
@@ -741,6 +873,11 @@ function buildReviewRuleGuide(input) {
|
|
|
741
873
|
update_call_template: `sf_knowledge_update(entry_name="${input.title}", add_decision_rules=[规则定义1, 规则定义2, ...])`,
|
|
742
874
|
};
|
|
743
875
|
}
|
|
876
|
+
/**
|
|
877
|
+
* 构建 acceptance_template 类型的自动丰富指南。
|
|
878
|
+
* @param input - 新增知识条目输入
|
|
879
|
+
* @returns 丰富指南
|
|
880
|
+
*/
|
|
744
881
|
function buildAcceptanceGuide(input) {
|
|
745
882
|
const topic = extractTopicFromTitle(input.title);
|
|
746
883
|
return {
|
|
@@ -784,6 +921,11 @@ function buildAcceptanceGuide(input) {
|
|
|
784
921
|
update_call_template: `sf_knowledge_update(entry_name="${input.title}", add_acceptance_criteria=[验收项1, 验收项2, ...])`,
|
|
785
922
|
};
|
|
786
923
|
}
|
|
924
|
+
/**
|
|
925
|
+
* 获取项目知识库目录路径。
|
|
926
|
+
* @param config - 项目配置
|
|
927
|
+
* @returns 知识库目录的绝对路径
|
|
928
|
+
*/
|
|
787
929
|
function getProjectKnowledgeDir(config) {
|
|
788
930
|
const projectDir = config._projectPath ?? process.cwd();
|
|
789
931
|
return path.join(projectDir, ".soloforge", "knowledge");
|