soloforge 1.0.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/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/adapters/claude_code/claude_md.d.ts +3 -0
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -0
- package/dist/adapters/claude_code/claude_md.js +79 -0
- package/dist/adapters/claude_code/claude_md.js.map +1 -0
- package/dist/adapters/claude_code/hooks.d.ts +3 -0
- package/dist/adapters/claude_code/hooks.d.ts.map +1 -0
- package/dist/adapters/claude_code/hooks.js +30 -0
- package/dist/adapters/claude_code/hooks.js.map +1 -0
- package/dist/adapters/claude_code/server.d.ts +10 -0
- package/dist/adapters/claude_code/server.d.ts.map +1 -0
- package/dist/adapters/claude_code/server.js +75 -0
- package/dist/adapters/claude_code/server.js.map +1 -0
- package/dist/adapters/claude_code/tools.d.ts +15 -0
- package/dist/adapters/claude_code/tools.d.ts.map +1 -0
- package/dist/adapters/claude_code/tools.js +758 -0
- package/dist/adapters/claude_code/tools.js.map +1 -0
- package/dist/adapters/trae/trae_config.d.ts +2 -0
- package/dist/adapters/trae/trae_config.d.ts.map +1 -0
- package/dist/adapters/trae/trae_config.js +22 -0
- package/dist/adapters/trae/trae_config.js.map +1 -0
- package/dist/adapters/trae/trae_rules.d.ts +3 -0
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -0
- package/dist/adapters/trae/trae_rules.js +85 -0
- package/dist/adapters/trae/trae_rules.js.map +1 -0
- package/dist/bin/soloforge.d.ts +3 -0
- package/dist/bin/soloforge.d.ts.map +1 -0
- package/dist/bin/soloforge.js +353 -0
- package/dist/bin/soloforge.js.map +1 -0
- package/dist/engine/adr_recorder.d.ts +13 -0
- package/dist/engine/adr_recorder.d.ts.map +1 -0
- package/dist/engine/adr_recorder.js +132 -0
- package/dist/engine/adr_recorder.js.map +1 -0
- package/dist/engine/change_coordinator.d.ts +17 -0
- package/dist/engine/change_coordinator.d.ts.map +1 -0
- package/dist/engine/change_coordinator.js +138 -0
- package/dist/engine/change_coordinator.js.map +1 -0
- package/dist/engine/classifier.d.ts +7 -0
- package/dist/engine/classifier.d.ts.map +1 -0
- package/dist/engine/classifier.js +135 -0
- package/dist/engine/classifier.js.map +1 -0
- package/dist/engine/code_reviewer.d.ts +15 -0
- package/dist/engine/code_reviewer.d.ts.map +1 -0
- package/dist/engine/code_reviewer.js +371 -0
- package/dist/engine/code_reviewer.js.map +1 -0
- package/dist/engine/confidence_scorer.d.ts +11 -0
- package/dist/engine/confidence_scorer.d.ts.map +1 -0
- package/dist/engine/confidence_scorer.js +30 -0
- package/dist/engine/confidence_scorer.js.map +1 -0
- package/dist/engine/contract_guard.d.ts +10 -0
- package/dist/engine/contract_guard.d.ts.map +1 -0
- package/dist/engine/contract_guard.js +471 -0
- package/dist/engine/contract_guard.js.map +1 -0
- package/dist/engine/convention_detector.d.ts +7 -0
- package/dist/engine/convention_detector.d.ts.map +1 -0
- package/dist/engine/convention_detector.js +93 -0
- package/dist/engine/convention_detector.js.map +1 -0
- package/dist/engine/debt_reporter.d.ts +4 -0
- package/dist/engine/debt_reporter.d.ts.map +1 -0
- package/dist/engine/debt_reporter.js +67 -0
- package/dist/engine/debt_reporter.js.map +1 -0
- package/dist/engine/debt_tracker.d.ts +20 -0
- package/dist/engine/debt_tracker.d.ts.map +1 -0
- package/dist/engine/debt_tracker.js +152 -0
- package/dist/engine/debt_tracker.js.map +1 -0
- package/dist/engine/debugger.d.ts +3 -0
- package/dist/engine/debugger.d.ts.map +1 -0
- package/dist/engine/debugger.js +291 -0
- package/dist/engine/debugger.js.map +1 -0
- package/dist/engine/delivery.d.ts +15 -0
- package/dist/engine/delivery.d.ts.map +1 -0
- package/dist/engine/delivery.js +182 -0
- package/dist/engine/delivery.js.map +1 -0
- package/dist/engine/dependency_scanner.d.ts +13 -0
- package/dist/engine/dependency_scanner.d.ts.map +1 -0
- package/dist/engine/dependency_scanner.js +275 -0
- package/dist/engine/dependency_scanner.js.map +1 -0
- package/dist/engine/evolver.d.ts +15 -0
- package/dist/engine/evolver.d.ts.map +1 -0
- package/dist/engine/evolver.js +167 -0
- package/dist/engine/evolver.js.map +1 -0
- package/dist/engine/failure_classifier.d.ts +11 -0
- package/dist/engine/failure_classifier.d.ts.map +1 -0
- package/dist/engine/failure_classifier.js +120 -0
- package/dist/engine/failure_classifier.js.map +1 -0
- package/dist/engine/feasibility_checker.d.ts +6 -0
- package/dist/engine/feasibility_checker.d.ts.map +1 -0
- package/dist/engine/feasibility_checker.js +88 -0
- package/dist/engine/feasibility_checker.js.map +1 -0
- package/dist/engine/git_deps.d.ts +37 -0
- package/dist/engine/git_deps.d.ts.map +1 -0
- package/dist/engine/git_deps.js +3 -0
- package/dist/engine/git_deps.js.map +1 -0
- package/dist/engine/impact_analyzer.d.ts +10 -0
- package/dist/engine/impact_analyzer.d.ts.map +1 -0
- package/dist/engine/impact_analyzer.js +171 -0
- package/dist/engine/impact_analyzer.js.map +1 -0
- package/dist/engine/intent_expander.d.ts +17 -0
- package/dist/engine/intent_expander.d.ts.map +1 -0
- package/dist/engine/intent_expander.js +447 -0
- package/dist/engine/intent_expander.js.map +1 -0
- package/dist/engine/knowledge_manager.d.ts +76 -0
- package/dist/engine/knowledge_manager.d.ts.map +1 -0
- package/dist/engine/knowledge_manager.js +781 -0
- package/dist/engine/knowledge_manager.js.map +1 -0
- package/dist/engine/migration_guard.d.ts +3 -0
- package/dist/engine/migration_guard.d.ts.map +1 -0
- package/dist/engine/migration_guard.js +235 -0
- package/dist/engine/migration_guard.js.map +1 -0
- package/dist/engine/observability.d.ts +33 -0
- package/dist/engine/observability.d.ts.map +1 -0
- package/dist/engine/observability.js +312 -0
- package/dist/engine/observability.js.map +1 -0
- package/dist/engine/onboarding.d.ts +27 -0
- package/dist/engine/onboarding.d.ts.map +1 -0
- package/dist/engine/onboarding.js +362 -0
- package/dist/engine/onboarding.js.map +1 -0
- package/dist/engine/prompt_experiment.d.ts +18 -0
- package/dist/engine/prompt_experiment.d.ts.map +1 -0
- package/dist/engine/prompt_experiment.js +127 -0
- package/dist/engine/prompt_experiment.js.map +1 -0
- package/dist/engine/resilience.d.ts +20 -0
- package/dist/engine/resilience.d.ts.map +1 -0
- package/dist/engine/resilience.js +210 -0
- package/dist/engine/resilience.js.map +1 -0
- package/dist/engine/scaffolder.d.ts +9 -0
- package/dist/engine/scaffolder.d.ts.map +1 -0
- package/dist/engine/scaffolder.js +222 -0
- package/dist/engine/scaffolder.js.map +1 -0
- package/dist/engine/scope_controller.d.ts +3 -0
- package/dist/engine/scope_controller.d.ts.map +1 -0
- package/dist/engine/scope_controller.js +121 -0
- package/dist/engine/scope_controller.js.map +1 -0
- package/dist/engine/task_context.d.ts +34 -0
- package/dist/engine/task_context.d.ts.map +1 -0
- package/dist/engine/task_context.js +321 -0
- package/dist/engine/task_context.js.map +1 -0
- package/dist/engine/task_planner.d.ts +11 -0
- package/dist/engine/task_planner.d.ts.map +1 -0
- package/dist/engine/task_planner.js +267 -0
- package/dist/engine/task_planner.js.map +1 -0
- package/dist/engine/team_awareness.d.ts +12 -0
- package/dist/engine/team_awareness.d.ts.map +1 -0
- package/dist/engine/team_awareness.js +121 -0
- package/dist/engine/team_awareness.js.map +1 -0
- package/dist/engine/test_generator.d.ts +9 -0
- package/dist/engine/test_generator.d.ts.map +1 -0
- package/dist/engine/test_generator.js +241 -0
- package/dist/engine/test_generator.js.map +1 -0
- package/dist/engine/test_quality.d.ts +9 -0
- package/dist/engine/test_quality.d.ts.map +1 -0
- package/dist/engine/test_quality.js +256 -0
- package/dist/engine/test_quality.js.map +1 -0
- package/dist/engine/traceability.d.ts +3 -0
- package/dist/engine/traceability.d.ts.map +1 -0
- package/dist/engine/traceability.js +137 -0
- package/dist/engine/traceability.js.map +1 -0
- package/dist/engine/verifier.d.ts +3 -0
- package/dist/engine/verifier.d.ts.map +1 -0
- package/dist/engine/verifier.js +202 -0
- package/dist/engine/verifier.js.map +1 -0
- package/dist/engine/workspace_manager.d.ts +29 -0
- package/dist/engine/workspace_manager.d.ts.map +1 -0
- package/dist/engine/workspace_manager.js +77 -0
- package/dist/engine/workspace_manager.js.map +1 -0
- package/dist/git/operations.d.ts +57 -0
- package/dist/git/operations.d.ts.map +1 -0
- package/dist/git/operations.js +215 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/conflict_detector.d.ts +6 -0
- package/dist/knowledge/conflict_detector.d.ts.map +1 -0
- package/dist/knowledge/conflict_detector.js +19 -0
- package/dist/knowledge/conflict_detector.js.map +1 -0
- package/dist/knowledge/health_checker.d.ts +10 -0
- package/dist/knowledge/health_checker.d.ts.map +1 -0
- package/dist/knowledge/health_checker.js +61 -0
- package/dist/knowledge/health_checker.js.map +1 -0
- package/dist/knowledge/index_manager.d.ts +35 -0
- package/dist/knowledge/index_manager.d.ts.map +1 -0
- package/dist/knowledge/index_manager.js +209 -0
- package/dist/knowledge/index_manager.js.map +1 -0
- package/dist/knowledge/loader.d.ts +13 -0
- package/dist/knowledge/loader.d.ts.map +1 -0
- package/dist/knowledge/loader.js +161 -0
- package/dist/knowledge/loader.js.map +1 -0
- package/dist/knowledge/writer.d.ts +15 -0
- package/dist/knowledge/writer.d.ts.map +1 -0
- package/dist/knowledge/writer.js +98 -0
- package/dist/knowledge/writer.js.map +1 -0
- package/dist/types.d.ts +724 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
- package/templates/config.yaml +53 -0
- package/templates/knowledge/acceptance_templates/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +45 -0
- package/templates/knowledge/acceptance_templates/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +39 -0
- package/templates/knowledge/acceptance_templates//345/211/215/347/253/257/351/241/265/351/235/242/351/252/214/346/224/266/346/270/205/345/215/225.md +27 -0
- package/templates/knowledge/acceptance_templates//345/216/237/345/236/213/350/257/264/346/230/216/346/250/241/347/211/210.md +180 -0
- package/templates/knowledge/acceptance_templates//345/220/216/347/253/257API/351/252/214/346/224/266/346/270/205/345/215/225.md +26 -0
- package/templates/knowledge/acceptance_templates//345/256/211/345/205/250/345/256/241/350/256/241/346/250/241/347/211/210.md +51 -0
- package/templates/knowledge/acceptance_templates//346/200/247/350/203/275/345/210/206/346/236/220/346/250/241/347/211/210.md +45 -0
- package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/345/257/271/346/216/245/346/226/271/346/241/210/346/250/241/347/211/210.md +45 -0
- package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/350/256/276/350/256/241/346/250/241/347/211/210.md +58 -0
- package/templates/knowledge/acceptance_templates//346/225/205/351/232/234/345/244/215/347/233/230/346/250/241/347/211/210.md +53 -0
- package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/346/226/271/346/241/210/346/250/241/347/211/210.md +45 -0
- package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/351/252/214/346/224/266/346/270/205/345/215/225.md +24 -0
- package/templates/knowledge/acceptance_templates//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +42 -0
- package/templates/knowledge/acceptance_templates//346/265/213/350/257/225/350/256/241/345/210/222/346/250/241/347/211/210.md +39 -0
- package/templates/knowledge/acceptance_templates//350/257/246/347/273/206/350/256/276/350/256/241/346/250/241/347/211/210.md +40 -0
- package/templates/knowledge/acceptance_templates//350/277/201/347/247/273/350/257/204/344/274/260/346/250/241/347/211/210.md +42 -0
- package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +26 -0
- package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +47 -0
- package/templates/knowledge/acceptance_templates//351/234/200/346/261/202/345/210/206/346/236/220/346/250/241/347/211/210.md +44 -0
- package/templates/knowledge/domain//345/244/232/347/247/237/346/210/267.md +35 -0
- package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +34 -0
- package/templates/knowledge/domain//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md +37 -0
- package/templates/knowledge/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +37 -0
- package/templates/knowledge/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +36 -0
- package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +38 -0
- package/templates/knowledge/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +34 -0
- package/templates/knowledge/domain//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md +24 -0
- package/templates/knowledge/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +36 -0
- package/templates/knowledge/procedures/Figma/344/272/244/344/273/230/346/265/201/347/250/213.md +35 -0
- package/templates/knowledge/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +28 -0
- package/templates/knowledge/procedures//344/273/243/347/240/201/351/227/250/347/246/201/346/265/201/347/250/213.md +33 -0
- package/templates/knowledge/procedures//344/273/273/345/212/241/346/213/206/350/247/243/346/265/201/347/250/213.md +31 -0
- package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +37 -0
- package/templates/knowledge/procedures//345/256/211/345/205/250/345/212/240/345/233/272/346/265/201/346/260/264/347/272/277.md +43 -0
- package/templates/knowledge/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +27 -0
- package/templates/knowledge/procedures//346/216/245/345/217/243/351/233/206/346/210/220/346/265/201/346/260/264/347/272/277.md +46 -0
- package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +38 -0
- package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/346/265/201/347/250/213.md +30 -0
- package/templates/knowledge/procedures//346/246/202/345/277/265/351/252/214/350/257/201/346/265/201/346/260/264/347/272/277.md +24 -0
- package/templates/knowledge/procedures//347/237/245/350/257/206/347/273/264/346/212/244/346/265/201/346/260/264/347/272/277.md +40 -0
- package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +45 -0
- package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/347/250/213.md +33 -0
- package/templates/knowledge/procedures//347/274/272/351/231/267/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +28 -0
- package/templates/knowledge/procedures//350/257/246/347/273/206/350/256/276/350/256/241/346/265/201/347/250/213.md +29 -0
- package/templates/knowledge/procedures//350/260/203/350/257/225/346/216/222/346/237/245/346/265/201/347/250/213.md +43 -0
- package/templates/knowledge/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +27 -0
- package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +45 -0
- package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +27 -0
- package/templates/knowledge/procedures//351/233/206/346/210/220/351/252/214/350/257/201/346/265/201/347/250/213.md +36 -0
- package/templates/knowledge/procedures//351/234/200/346/261/202/346/276/204/346/270/205/346/265/201/347/250/213.md +32 -0
- package/templates/knowledge/procedures//351/252/214/346/224/266/346/265/213/350/257/225/350/247/204/345/210/222.md +40 -0
- package/templates/knowledge/procedures//351/252/214/350/257/201/350/256/241/345/210/222/346/265/201/347/250/213.md +32 -0
- package/templates/knowledge/product_profiles/b2b-internal.yaml +35 -0
- package/templates/knowledge/product_profiles/b2c.yaml +37 -0
- package/templates/knowledge/product_profiles/saas.yaml +35 -0
- package/templates/knowledge/review_rules//345/256/211/345/205/250/345/256/241/346/237/245/350/247/204/345/210/231.md +79 -0
- package/templates/knowledge/review_rules//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md +67 -0
- package/templates/knowledge/review_rules//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md +61 -0
- package/templates/knowledge/review_rules//346/216/245/345/217/243/345/245/221/347/272/246/345/256/241/346/237/245/350/247/204/345/210/231.md +67 -0
- package/templates/knowledge/review_rules//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md +62 -0
- package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +80 -0
- package/templates/patterns/API/350/256/276/350/256/241/350/247/204/350/214/203.md +31 -0
- package/templates/patterns/Docker/351/203/250/347/275/262/350/247/204/350/214/203.md +31 -0
- package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +31 -0
- package/templates/patterns/N/345/212/2401/346/237/245/350/257/242/350/247/204/350/214/203.md +32 -0
- package/templates/patterns/React/345/210/227/350/241/250/350/241/250/346/240/274/350/247/204/350/214/203.md +29 -0
- package/templates/patterns/React/346/216/245/345/217/243/351/233/206/346/210/220/350/247/204/350/214/203.md +28 -0
- package/templates/patterns/React/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +28 -0
- package/templates/patterns/React/347/273/204/344/273/266/350/247/204/350/214/203.md +28 -0
- package/templates/patterns/React/350/241/250/345/215/225/350/247/204/350/214/203.md +29 -0
- package/templates/patterns/React/350/267/257/347/224/261/350/247/204/350/214/203.md +29 -0
- package/templates/patterns/Schema/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -0
- package/templates/patterns/Vue/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +28 -0
- package/templates/patterns/Vue/347/273/204/344/273/266/350/247/204/350/214/203.md +28 -0
- package/templates/patterns/Vue/350/267/257/347/224/261/350/247/204/350/214/203.md +29 -0
- package/templates/patterns//344/272/213/344/273/266/351/251/261/345/212/250/350/247/204/350/214/203.md +32 -0
- package/templates/patterns//344/272/213/345/212/241/346/250/241/345/274/217/350/247/204/350/214/203.md +28 -0
- package/templates/patterns//344/274/230/351/233/205/345/201/234/346/234/272/350/247/204/350/214/203.md +30 -0
- package/templates/patterns//345/205/250/346/240/210/346/265/201/347/250/213/344/277/256/345/244/215.md +31 -0
- package/templates/patterns//345/210/206/351/241/265/346/237/245/350/257/242/350/247/204/350/214/203.md +27 -0
- package/templates/patterns//345/211/215/347/253/257/346/200/247/350/203/275/350/247/204/350/214/203.md +33 -0
- package/templates/patterns//345/221/275/345/220/215/350/247/204/350/214/203.md +32 -0
- package/templates/patterns//345/233/275/351/231/205/345/214/226/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//345/242/236/345/210/240/346/224/271/346/237/245/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//345/244/226/351/203/250/344/276/235/350/265/226/350/247/204/350/214/203.md +29 -0
- package/templates/patterns//345/245/221/347/272/246/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -0
- package/templates/patterns//345/256/232/346/227/266/344/273/273/345/212/241/350/247/204/350/214/203.md +25 -0
- package/templates/patterns//345/256/236/346/227/266/346/216/250/351/200/201/350/247/204/350/214/203.md +33 -0
- package/templates/patterns//345/267/245/347/250/213/347/272/252/345/276/213.md +39 -0
- package/templates/patterns//345/271/266/345/217/221/346/216/247/345/210/266/350/247/204/350/214/203.md +34 -0
- package/templates/patterns//345/274/202/346/255/245/345/257/274/345/207/272/350/247/204/350/214/203.md +27 -0
- package/templates/patterns//346/216/245/345/217/243/345/245/221/347/272/246/350/247/204/350/214/203.md +30 -0
- package/templates/patterns//346/220/234/347/264/242/346/250/241/345/274/217/350/247/204/350/214/203.md +32 -0
- package/templates/patterns//346/225/260/346/215/256/351/232/220/347/247/201/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//346/226/207/344/273/266/344/270/212/344/274/240/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//346/227/240/351/232/234/347/242/215/350/247/204/350/214/203.md +33 -0
- package/templates/patterns//346/227/245/345/277/227/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//346/235/203/351/231/220/350/256/244/350/257/201/350/247/204/350/214/203.md +35 -0
- package/templates/patterns//346/236/266/346/236/204/347/272/242/347/272/277.md +30 -0
- package/templates/patterns//346/265/213/350/257/225/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -0
- package/templates/patterns//347/206/224/346/226/255/351/231/215/347/272/247/350/247/204/350/214/203.md +33 -0
- package/templates/patterns//347/212/266/346/200/201/346/265/201/350/275/254/350/247/204/350/214/203.md +29 -0
- package/templates/patterns//347/272/246/346/235/237/345/256/236/347/216/260/350/247/204/350/214/203.md +32 -0
- package/templates/patterns//347/274/223/345/255/230/347/255/226/347/225/245/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//347/274/226/347/240/201/350/264/250/351/207/217/350/247/204/350/214/203.md +31 -0
- package/templates/patterns//347/274/272/351/231/267/347/256/241/347/220/206/350/247/204/350/214/203.md +30 -0
- package/templates/patterns//350/260/203/350/257/225/346/226/271/346/263/225/350/256/272.md +28 -0
- package/templates/patterns//350/276/223/345/205/245/346/240/241/351/252/214/350/247/204/350/214/203.md +30 -0
- package/templates/patterns//351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +32 -0
- package/templates/patterns//351/224/231/350/257/257/350/276/271/347/225/214/350/247/204/350/214/203.md +24 -0
- package/templates/patterns//351/242/206/345/237/237/351/251/261/345/212/250/350/256/276/350/256/241/350/247/204/350/214/203.md +29 -0
- package/templates/scaffolds/react/Form.tsx.hbs +16 -0
- package/templates/scaffolds/react/List.tsx.hbs +28 -0
- package/templates/scaffolds/react/Page.test.tsx.hbs +10 -0
- package/templates/scaffolds/react/Page.tsx.hbs +14 -0
- package/templates/scaffolds/react/README.md.hbs +44 -0
- package/templates/scaffolds/react/service.ts.hbs +37 -0
- package/templates/scaffolds/react/types.ts.hbs +6 -0
- package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +88 -0
- package/templates/scaffolds/spring-boot/ApiContract.md.hbs +110 -0
- package/templates/scaffolds/spring-boot/Controller.java.hbs +43 -0
- package/templates/scaffolds/spring-boot/DTO.java.hbs +9 -0
- package/templates/scaffolds/spring-boot/Entity.java.hbs +12 -0
- package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +28 -0
- package/templates/scaffolds/spring-boot/Mapper.java.hbs +9 -0
- package/templates/scaffolds/spring-boot/PageResponse.java.hbs +29 -0
- package/templates/scaffolds/spring-boot/Service.java.hbs +12 -0
- package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +48 -0
- package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +22 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: event-driven
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 事件驱动, 事件溯源, 领域事件, 消息队列, MQ, 异步消息, 解耦, 事件发布, Event Sourcing, CQRS, 最终一致性
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 跨模块非强一致性交互优先使用事件驱动(MQ),未使用时必须文档化原因
|
|
11
|
+
- 事件必须幂等消费:消费者必须能安全处理重复消息(唯一约束/去重表/幂等键)
|
|
12
|
+
- 事件消费失败必须有重试机制(建议 3 次)+ 死信队列(DLQ),禁止静默丢弃
|
|
13
|
+
- 事件结构必须包含:事件类型、事件 ID(幂等键)、发生时间、聚合 ID、事件载荷
|
|
14
|
+
- 禁止通过事件传递大对象(如完整订单),事件载荷只传 ID + 关键变更字段
|
|
15
|
+
- 事件消费者异常不影响事件生产者(异步解耦),生产者不依赖消费者响应
|
|
16
|
+
- 最终一致性场景必须定义:最大延迟容忍、补偿策略、对账机制
|
|
17
|
+
- 禁止用消息队列做 RPC(同步等待响应),同步调用走 HTTP/Feign/gRPC
|
|
18
|
+
- 事件消费者必须实现幂等处理,同一事件重复消费不能产生副作用
|
|
19
|
+
- 事件必须包含版本号和发生时间,便于消费者兼容演进
|
|
20
|
+
- 事件消费失败必须有重试机制(退避策略)和死信队列兜底
|
|
21
|
+
- 关键业务事件必须持久化存储,不能只发 MQ 不落库
|
|
22
|
+
- 事件体禁止包含大对象(如完整订单),应只传 ID 引用
|
|
23
|
+
|
|
24
|
+
## 验收项
|
|
25
|
+
- [AC-01] 跨模块交互使用事件驱动或有文档化原因
|
|
26
|
+
- [AC-02] 事件消费幂等
|
|
27
|
+
- [AC-03] 消费失败有重试 + 死信队列
|
|
28
|
+
- [AC-04] 事件结构包含类型/ID/时间/载荷
|
|
29
|
+
- [AC-05] 最终一致性有补偿和对账机制
|
|
30
|
+
- [AC-06] 消费者幂等处理
|
|
31
|
+
- [AC-07] 失败有重试和死信队列
|
|
32
|
+
- [AC-08] 关键事件持久化
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: transaction-pattern
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 事务, @Transactional, 分布式事务, 事务传播, 事务隔离, 数据一致性, 回滚, commit, rollback, 补偿事务
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 写操作 Service 方法必须标注 @Transactional,且显式指定 rollbackFor = Exception.class
|
|
11
|
+
- 禁止在 Controller 层使用事务注解,事务边界必须在 Service 层
|
|
12
|
+
- @Transactional 方法禁止被同类内部调用(AOP 代理失效),必须通过注入调用
|
|
13
|
+
- 事务方法必须短小快速,禁止在事务中执行外部 HTTP 调用、文件 I/O、MQ 发送
|
|
14
|
+
- 只读查询方法必须标注 @Transactional(readOnly = true),降低数据库压力
|
|
15
|
+
- 跨服务分布式事务优先使用最终一致性(事件 + 补偿),禁止强依赖 2PC/XA
|
|
16
|
+
- 跨服务事务必须有补偿机制:正向操作失败自动补偿或定时对账修复
|
|
17
|
+
- 嵌套事务优先使用 REQUIRES_NEW 分割独立事务单元,避免大事务锁表
|
|
18
|
+
- 传播行为默认 REQUIRED 即可,禁止随意使用 REQUIRES_NEW(容易产生数据不一致)
|
|
19
|
+
|
|
20
|
+
## 验收项
|
|
21
|
+
- [AC-01] 写操作有 @Transactional(rollbackFor = Exception.class)
|
|
22
|
+
- [AC-02] 事务方法无外部调用和文件 I/O
|
|
23
|
+
- [AC-03] 只读方法有 readOnly = true
|
|
24
|
+
- [AC-04] 跨服务事务有补偿机制
|
|
25
|
+
- [AC-05] 无同类内部调用导致 AOP 失效
|
|
26
|
+
- [AC-06] rollbackFor 显式指定
|
|
27
|
+
- [AC-07] 无内部调用导致事务失效
|
|
28
|
+
- [AC-08] 只读查询标注 readOnly
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: graceful-shutdown
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 优雅停机, 服务下线, 优雅关闭, shutdown, 健康检查, readiness, liveness, 启停, 灰度发布, 滚动更新
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 服务必须实现优雅停机:收到 SIGTERM 后停止接收新请求,等待正在处理请求完成(建议超时 30s)
|
|
11
|
+
- 必须提供健康检查端点:liveness(进程存活)和 readiness(服务就绪,依赖全部可用)
|
|
12
|
+
- 滚动更新期间必须先从注册中心摘除再停机,禁止直接 kill 导致请求丢失
|
|
13
|
+
- 启动时必须等待依赖组件就绪(DB 连接池、Redis、MQ)后再注册到服务发现
|
|
14
|
+
- 定时任务必须在停机时中断执行并记录中断点,重启后可恢复
|
|
15
|
+
- 连接池必须配置合理的超时和最大连接数,防止资源泄漏
|
|
16
|
+
- Spring Boot 应用必须配置 server.shutdown=graceful + spring.lifecycle.timeout-per-shutdown-phase
|
|
17
|
+
- 停机时必须等待正在处理的请求完成(graceful shutdown),设置等待超时(如 30s)
|
|
18
|
+
- 线程池必须在停机时执行 shutdownNow() + awaitTermination(),确保任务不丢失
|
|
19
|
+
- 定时任务必须在停机时停止调度,正在执行的任务必须完成或中断
|
|
20
|
+
- 停机前必须从注册中心(如 Nacos/Eureka)注销,停止接收新流量
|
|
21
|
+
- Spring Boot 必须配置 server.shutdown=graceful 和 spring.lifecycle.timeout-per-shutdown-phase
|
|
22
|
+
|
|
23
|
+
## 验收项
|
|
24
|
+
- [AC-01] 服务实现优雅停机(等待请求完成)
|
|
25
|
+
- [AC-02] 健康检查区分 liveness/readiness
|
|
26
|
+
- [AC-03] 滚动更新先摘除再停机
|
|
27
|
+
- [AC-04] 启动时等待依赖就绪
|
|
28
|
+
- [AC-05] 请求优雅完成
|
|
29
|
+
- [AC-06] 线程池正确关闭
|
|
30
|
+
- [AC-07] 从注册中心注销
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fullstack-flowheal
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 流程修复, 全栈诊断, E2E修复, 修复流程, FlowHeal, 诊断修复, 跨层修复, 流程异常
|
|
5
|
+
scope: [backend, frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 必须严格遵循 5 步顺序:定义用例 → 收集证据 → 诊断 → 补丁计划 → 验证,禁止跳步
|
|
11
|
+
- 证据优先、流程优先、浏览器证据优先、最小补丁、分层验证
|
|
12
|
+
- 禁止将不稳定测试视为业务失败,先稳定复现再判断
|
|
13
|
+
- 禁止删除断言、增加 sleep、降低覆盖率、增加 mock 来制造通过
|
|
14
|
+
- 禁止用 SQL 直接写业务测试数据
|
|
15
|
+
- 禁止自动修改事务/权限/金额/库存/安全策略
|
|
16
|
+
- 一次只修一个问题,禁止跨层大重构同时进行
|
|
17
|
+
- 高风险/低置信度/跨多服务的复杂变更上报人工决策
|
|
18
|
+
- 端到端测试必须从浏览器页面出发,禁止绕过前端
|
|
19
|
+
- 前后端联调必须基于接口文档(OpenAPI),禁止口头约定字段
|
|
20
|
+
- 前后端字段命名不一致时以后端为准,前端通过映射层适配
|
|
21
|
+
- 接口变更必须同步更新文档和前端调用,禁止只改一侧
|
|
22
|
+
- 联调问题必须在缺陷系统记录根因(文档不完整/需求不明确/理解偏差),持续改进
|
|
23
|
+
|
|
24
|
+
## 验收项
|
|
25
|
+
- [AC-01] 遵循 5 步顺序(用例→证据→诊断→补丁→验证)
|
|
26
|
+
- [AC-02] 证据包含 UI 追踪/API 调用/后端 traceId/数据状态
|
|
27
|
+
- [AC-03] 修复后重新构建再验证
|
|
28
|
+
- [AC-04] 最终状态显式声明(ready_to_commit/escalated/reverted)
|
|
29
|
+
- [AC-05] 联调基于接口文档
|
|
30
|
+
- [AC-06] 接口变更同步更新文档和前端
|
|
31
|
+
- [AC-07] 联调问题记录根因
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-pagination
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 分页查询接口, 分页, 翻页, PageRequest, pagination, 列表查询, 数据列表, 页码, pageSize, pageNo, 查询列表
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 必须使用数据库分页查询(LIMIT/OFFSET),禁止内存 subList 分页
|
|
11
|
+
- 必须限制最大 pageSize(不超过 100)
|
|
12
|
+
- 排序字段必须使用白名单校验,禁止直接拼接用户输入
|
|
13
|
+
- 深分页(page > 1000)必须使用游标分页替代 OFFSET
|
|
14
|
+
- 分页响应必须包含 total、page、size、totalPages 字段
|
|
15
|
+
- 深分页(offset > 10000)必须使用游标分页或子查询优化,禁止直接 OFFSET
|
|
16
|
+
- 分页查询禁止使用 SELECT *,必须指定所需字段
|
|
17
|
+
- 排序字段必须是索引列,禁止对非索引列排序导致全表扫描
|
|
18
|
+
- 前端分页控件必须显示总条数和页码跳转
|
|
19
|
+
|
|
20
|
+
## 验收项
|
|
21
|
+
- [AC-01] page >= 1 且 1 <= size <= 100
|
|
22
|
+
- [AC-02] 使用数据库分页而非内存分页
|
|
23
|
+
- [AC-03] 响应含 total/page/size/totalPages
|
|
24
|
+
- [AC-04] 排序字段白名单校验
|
|
25
|
+
- [AC-05] 深分页有优化策略
|
|
26
|
+
- [AC-06] 排序字段使用索引列
|
|
27
|
+
- [AC-07] 前端有页码跳转
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-performance
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 前端性能, 页面加载, 首屏时间, 性能优化, 懒加载, 代码分割, bundle, 白屏时间, FCP, LCP, 内存泄漏
|
|
5
|
+
scope: [frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 路由级别必须使用懒加载(React.lazy / dynamic import),禁止首屏加载所有页面代码
|
|
11
|
+
- 大型第三方库(图表、富文本编辑器)必须按需加载,禁止全量引入
|
|
12
|
+
- 图片必须使用懒加载(Intersection Observer 或 loading="lazy"),大图必须压缩和适配分辨率
|
|
13
|
+
- 列表数据超过 100 条必须使用虚拟滚动(react-window / react-virtualized)
|
|
14
|
+
- 组件卸载时必须清理副作用(定时器、WebSocket、事件监听),防止内存泄漏
|
|
15
|
+
- useEffect 依赖数组必须准确,禁止无依赖导致每次渲染执行
|
|
16
|
+
- 重复渲染必须用 React.memo / useMemo / useCallback 优化,但禁止过度优化(简单组件不需要 memo)
|
|
17
|
+
- 首屏关键资源必须预加载,非关键资源延迟加载
|
|
18
|
+
- 首屏加载时间必须 ≤ 3s(Fast 3G),超过时必须优化(懒加载、代码分割、CDN)
|
|
19
|
+
- 列表渲染超过 100 行必须使用虚拟滚动(react-window / vue-virtual-scroller)
|
|
20
|
+
- 组件重渲染必须有明确优化(React.memo / useMemo / shouldComponentUpdate)
|
|
21
|
+
- 图片资源必须使用 WebP 格式 + CDN 加速 + 懒加载
|
|
22
|
+
- 生产构建必须开启 Tree Shaking + Code Splitting + Gzip 压缩
|
|
23
|
+
|
|
24
|
+
## 验收项
|
|
25
|
+
- [AC-01] 路由级别懒加载
|
|
26
|
+
- [AC-02] 大型库按需引入
|
|
27
|
+
- [AC-03] 组件卸载清理副作用
|
|
28
|
+
- [AC-04] useEffect 依赖准确无冗余执行
|
|
29
|
+
- [AC-05] 长列表使用虚拟滚动
|
|
30
|
+
- [AC-06] 首屏 ≤ 3s
|
|
31
|
+
- [AC-07] 长列表虚拟滚动
|
|
32
|
+
- [AC-08] 图片 WebP + CDN + 懒加载
|
|
33
|
+
- [AC-09] 生产构建优化开启
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: naming-convention
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 命名规范, 命名约定, 变量命名, 类命名, 接口命名, 表命名, 字段命名, API路径命名
|
|
5
|
+
scope: [backend, frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- Java 类名使用 UpperCamelCase,方法/变量使用 lowerCamelCase,常量使用 UPPER_SNAKE_CASE
|
|
11
|
+
- 数据库表名使用 snake_case,字段名使用 snake_case,主键统一命名为 id
|
|
12
|
+
- API 路径使用 kebab-case 复数名词(如 /api/v1/user-orders),禁止在路径中使用动词
|
|
13
|
+
- 前端组件文件名使用 PascalCase,CSS 类名使用 kebab-case,路由路径使用 kebab-case
|
|
14
|
+
- 禁止使用无业务含义的命名(data、info、result、temp、list、item、obj)
|
|
15
|
+
- Boolean 变量/方法必须以 is/has/can/should 开头(如 isActive、hasPermission)
|
|
16
|
+
- 接口/抽象类命名应体现行为意图(如 UserRepository、PaymentService)
|
|
17
|
+
- 枚举类名使用名词,枚举值使用 UPPER_SNAKE_CASE
|
|
18
|
+
- 包名使用全小写点分隔(com.company.module.service),禁止下划线或大写
|
|
19
|
+
- 常量必须定义在常量类或枚举中,禁止散落在业务代码各处
|
|
20
|
+
- 方法名应为动词或动词短语(getUserById、calculateTotalAmount)
|
|
21
|
+
- 泛型类型参数使用大写单字母或简写(T、E、K、V、R、REQ、RESP)
|
|
22
|
+
- 配置项 key 使用点分隔的 kebab-case(spring.datasource.url)
|
|
23
|
+
|
|
24
|
+
## 验收项
|
|
25
|
+
- [AC-01] Java 类/方法/变量/常量命名风格一致
|
|
26
|
+
- [AC-02] 数据库表名/字段名统一 snake_case
|
|
27
|
+
- [AC-03] API 路径 kebab-case + 复数名词
|
|
28
|
+
- [AC-04] 前端组件 PascalCase、CSS kebab-case
|
|
29
|
+
- [AC-05] 无无含义命名(data/info/result/temp)
|
|
30
|
+
- [AC-06] Boolean 变量 is/has/can 前缀
|
|
31
|
+
- [AC-07] 方法名为动词短语
|
|
32
|
+
- [AC-08] 枚举值 UPPER_SNAKE_CASE
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: i18n-l10n
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 国际化, 多语言, i18n, l10n, 语言切换, 多语言支持, 本地化, 翻译, locale, 中英文
|
|
5
|
+
scope: [frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 所有用户可见文案禁止硬编码,必须使用 i18n key(如 t('user.login.title'))
|
|
11
|
+
- 日期格式必须按 locale 显示(中文 yyyy-MM-dd,英文 MM/dd/yyyy),禁止固定格式
|
|
12
|
+
- 金额必须按 locale 格式化(符号位置、千位分隔符、小数位数)
|
|
13
|
+
- 后端接口返回的錙误码必须映射为前端多语言提示,禁止直接展示后端錙误消息
|
|
14
|
+
- 语言资源文件必须按模块拆分,禁止单一大文件(建议 pages/common/components 分目录)
|
|
15
|
+
- 新增语言只需新增资源文件,不修改业务代码
|
|
16
|
+
- 接口返回的业务数据(枚举、状态名)由后端提供多语言字段,前端不维护业务数据翻译
|
|
17
|
+
- 所有用户可见文本必须通过 i18n 资源文件管理,禁止硬编码字符串
|
|
18
|
+
- 日期/时间必须根据用户时区显示,禁止使用服务端固定时区
|
|
19
|
+
- 数字/货币格式必须根据 locale 格式化(如 1,234.56 vs 1.234,56)
|
|
20
|
+
- 文案翻译必须由专业翻译完成,禁止机器翻译直接上线
|
|
21
|
+
- 多语言文案禁止拼装(如 "欢迎" + userName),应使用带占位符的完整模板
|
|
22
|
+
|
|
23
|
+
## 验收项
|
|
24
|
+
- [AC-01] 用户可见文案通过 i18n key 引用
|
|
25
|
+
- [AC-02] 日期和金额按 locale 格式化
|
|
26
|
+
- [AC-03] 錙误码映射为多语言提示
|
|
27
|
+
- [AC-04] 资源文件按模块拆分
|
|
28
|
+
- [AC-05] 无硬编码用户可见文本
|
|
29
|
+
- [AC-06] 日期时间按时区显示
|
|
30
|
+
- [AC-07] 数字货币按 locale 格式化
|
|
31
|
+
- [AC-08] 无拼装多语言文案
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crud-operation
|
|
3
|
+
type: pattern
|
|
4
|
+
when: CRUD, 增删改查, 新建接口, 修改数据, 删除数据, 查询详情, 编辑, 保存, 入库, 新增功能
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 必须遵循 Controller → Service → Mapper/Repository 三层分离
|
|
11
|
+
- 禁止 Controller 包含业务逻辑(if/else 分支、计算、状态机)
|
|
12
|
+
- 禁止 DTO 和 Entity 混用,外部请求不可直接操作数据库字段
|
|
13
|
+
- 批量操作禁止在循环中逐条调用数据库
|
|
14
|
+
- 写操作 Service 方法必须有 @Transactional 注解
|
|
15
|
+
- 删除操作必须记录操作人和原因
|
|
16
|
+
- 列表查询接口必须返回分页结构(total、list、pageNum、pageSize),禁止返回全量数据
|
|
17
|
+
- 创建/更新接口必须返回完整实体或 ID,禁止返回 void
|
|
18
|
+
- 逻辑删除必须使用统一字段(如 is_deleted),禁止物理删除业务数据
|
|
19
|
+
- 并发更新场景必须使用乐观锁(version 字段或更新时间条件),防止数据覆盖
|
|
20
|
+
- 批量更新/删除操作必须有数量上限(如 ≤ 500 条),防止大批量锁表
|
|
21
|
+
|
|
22
|
+
## 验收项
|
|
23
|
+
- [AC-01] Controller 无业务逻辑
|
|
24
|
+
- [AC-02] DTO/Entity 分离
|
|
25
|
+
- [AC-03] 写操作有事务注解
|
|
26
|
+
- [AC-04] 批量操作使用 batch SQL
|
|
27
|
+
- [AC-05] 删除有审计记录
|
|
28
|
+
- [AC-06] 列表查询返回分页结构
|
|
29
|
+
- [AC-07] 创建/更新返回完整数据
|
|
30
|
+
- [AC-08] 逻辑删除而非物理删除
|
|
31
|
+
- [AC-09] 并发更新有乐观锁保护
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: external-dependency
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 外部依赖, 第三方接口, 外部服务调用, HTTP客户端, Feign, RPC, 微服务调用, 超时, 重试, 降级
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 每个外部依赖调用必须定义超时时间,禁止无限等待
|
|
11
|
+
- 需要重试时必须同时定义幂等或去重策略,避免重复副作用
|
|
12
|
+
- 需要降级时必须定义:降级行为、用户提示、恢复条件
|
|
13
|
+
- 新增配置项必须文档化:默认值、环境差异、灰度方式、回滚策略
|
|
14
|
+
- 外部调用失败必须有区别于业务异常的错误码和用户提示
|
|
15
|
+
- 外部依赖必须设置合理的超时时间(连接超时 + 读超时),禁止无限等待
|
|
16
|
+
- 外部依赖调用必须有熔断保护,连续失败 N 次自动熔断
|
|
17
|
+
- 外部依赖必须有降级策略(返回缓存数据/默认值),不能因为依赖故障拖垮主流程
|
|
18
|
+
- 第三方库版本必须锁定(package-lock.json / Gradle version),禁止使用 latest 或范围版本
|
|
19
|
+
- 外部依赖的健康检查必须纳入监控,响应时间/成功率异常时触发告警
|
|
20
|
+
|
|
21
|
+
## 验收项
|
|
22
|
+
- [AC-01] 外部调用有超时配置
|
|
23
|
+
- [AC-02] 重试操作有幂等/去重策略
|
|
24
|
+
- [AC-03] 降级场景有用户提示和恢复条件
|
|
25
|
+
- [AC-04] 外部调用失败有独立错误码
|
|
26
|
+
- [AC-05] 外部调用有超时配置
|
|
27
|
+
- [AC-06] 有熔断和降级策略
|
|
28
|
+
- [AC-07] 依赖版本锁定
|
|
29
|
+
- [AC-08] 依赖健康检查有监控
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: contract-compatibility
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 接口变更, API变更, 合同变更, 接口兼容, 向后兼容, 废弃接口, 版本迁移
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- API 契约是前后端对齐的唯一信源,每次变更必须有 diff 记录和版本说明
|
|
11
|
+
- 变更必须前向兼容,破坏性变更必须标记 deprecated 并提供至少一个完整版本的过渡期
|
|
12
|
+
- 新增必填请求字段、删除字段、改变字段类型、修改路径、改变错误码含义均为破坏性变更,需要废弃流程
|
|
13
|
+
- 每次契约变更必须同步更新接口文档和 schema 定义
|
|
14
|
+
- 禁止前后端口头约定替代正式契约变更
|
|
15
|
+
- 新增可选字段必须设默认值,保证旧客户端兼容
|
|
16
|
+
- 枚举类型新增值必须评估对所有消费方的影响
|
|
17
|
+
- 删除字段必须分阶段:先标记 @Deprecated → 确认无消费方 → 下版本移除
|
|
18
|
+
- 数据库字段变更必须兼容旧代码(先加新字段 → 迁移数据 → 再删旧字段)
|
|
19
|
+
- API 路径变更必须保留旧路径并重定向,给予消费方充足迁移时间
|
|
20
|
+
|
|
21
|
+
## 验收项
|
|
22
|
+
- [AC-01] 接口变更有 diff 记录
|
|
23
|
+
- [AC-02] 破坏性变更有 deprecated 过渡期
|
|
24
|
+
- [AC-03] 文档与 schema 同步更新
|
|
25
|
+
- [AC-04] 无口头约定的非正式变更
|
|
26
|
+
- [AC-05] 新字段有默认值
|
|
27
|
+
- [AC-06] 删除字段分阶段进行
|
|
28
|
+
- [AC-07] 数据库变更兼容旧代码
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scheduled-task
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 定时任务, 异步任务, cron, 调度, @Scheduled, 异步执行, 重试, 延迟任务, 周期任务, 后台任务, 定时执行
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 多实例部署的定时任务必须使用分布式锁,禁止裸 @Scheduled
|
|
11
|
+
- 每次执行必须记录状态(开始/结束时间、结果、错误信息)
|
|
12
|
+
- 执行失败必须有告警通知(钉钉/邮件/Slack)
|
|
13
|
+
- 任务执行时间不得超过调度间隔的一半,防止堆积
|
|
14
|
+
- 失败任务必须有重试机制(建议最多 3 次)
|
|
15
|
+
- 定时任务必须配置超时时间,防止任务卡死影响后续调度
|
|
16
|
+
- 定时任务禁止使用固定间隔执行长事务,必须拆分为小批次处理
|
|
17
|
+
- 定时任务必须有手动触发入口(管理后台或 API),便于紧急修复数据
|
|
18
|
+
|
|
19
|
+
## 验收项
|
|
20
|
+
- [AC-01] 分布式锁防重复执行
|
|
21
|
+
- [AC-02] 每次执行记录状态
|
|
22
|
+
- [AC-03] 失败有告警通知
|
|
23
|
+
- [AC-04] 执行时间不超调度间隔一半
|
|
24
|
+
- [AC-05] 任务有超时配置
|
|
25
|
+
- [AC-06] 有手动触发入口
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: websocket-realtime
|
|
3
|
+
type: pattern
|
|
4
|
+
when: WebSocket, 实时推送, 实时通知, 在线状态, 即时通讯, SSE, Server-Sent Events, 消息推送, 长连接
|
|
5
|
+
scope: [backend, frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- WebSocket 连接必须有心跳机制(建议 30s),检测断线并自动重连
|
|
11
|
+
- 重连必须使用指数退避策略(1s/2s/4s/8s/max 30s),禁止无限重试
|
|
12
|
+
- 消息必须有序号或时间戳,消费端处理乱序和去重
|
|
13
|
+
- 连接异常断开时,未确认消息必须有补偿机制(重新拉取 / 离线消息队列)
|
|
14
|
+
- 后端推送频率必须有熔断保护,防止消息风暴压垮客户端
|
|
15
|
+
- 单向推送优先使用 SSE(更简单),双向通信才使用 WebSocket
|
|
16
|
+
- 生产环境 WebSocket 必须通过 Nginx 反向代理,配置超时和连接数限制
|
|
17
|
+
- 前端组件卸载时必须关闭 WebSocket 连接,防止内存泄漏
|
|
18
|
+
- WebSocket 连接必须有自动重连机制(指数退避策略),断线后自动恢复
|
|
19
|
+
- 推送消息必须携带消息 ID 和时间戳,支持客户端去重和排序
|
|
20
|
+
- 服务端必须实现消息缓冲,用户短暂离线后重连可获取未读消息
|
|
21
|
+
- 推送消息体必须精简(≤ 4KB),大数据通过接口拉取,不通过推送传输
|
|
22
|
+
- 必须支持优雅降级(WebSocket → SSE → 轮询),兼容不同网络环境
|
|
23
|
+
|
|
24
|
+
## 验收项
|
|
25
|
+
- [AC-01] 有心跳和自动重连机制
|
|
26
|
+
- [AC-02] 重连使用指数退避
|
|
27
|
+
- [AC-03] 消息有去重处理
|
|
28
|
+
- [AC-04] 组件卸载关闭连接
|
|
29
|
+
- [AC-05] 未确认消息有补偿机制
|
|
30
|
+
- [AC-06] 自动重连机制
|
|
31
|
+
- [AC-07] 消息去重和排序
|
|
32
|
+
- [AC-08] 离线消息缓冲
|
|
33
|
+
- [AC-09] 降级策略(WS→SSE→轮询)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: engineering-discipline
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 工程纪律, 工作原则, 开发原则, 证据优先, 变更追溯, 缺陷预防, 设计落地, 推论与事实
|
|
5
|
+
scope: [backend, frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 每行代码变更必须可追溯到任务卡片、设计决策或缺陷根因,禁止无来源的孤立变更
|
|
11
|
+
- 解释不替代证据,"理论上修好了"不可接受,必须有执行证据
|
|
12
|
+
- 推论不得冒充事实,必须显式区分已确认事实、推论和未知项
|
|
13
|
+
- 未知项必须显式记录并跟进,禁止静默跳过
|
|
14
|
+
- 规则只从真实缺陷中提取,禁止凭空捏造预防性规则
|
|
15
|
+
- 复发缺陷必须产出至少一条规则或检查项(防复发闭环)
|
|
16
|
+
- 设计必须提供可实施锚点(数据结构、接口定义、状态机),禁止只给抽象原则
|
|
17
|
+
- 先验证后判断,禁止先下结论再找理由
|
|
18
|
+
- 一级证据(运行时、真实部署、真实浏览器)优先于二级文档,禁止用 dry-run/静态分析/AI 摘要冒充运行时证据
|
|
19
|
+
- 根因定位先于代码修改,禁止试错式补丁叠补丁
|
|
20
|
+
- 自动修复循环上限 3 轮,同一错误 >=2 次触发回填,>=4 次记录为复发缺陷
|
|
21
|
+
- 超出范围边界时立即上报,禁止自行决定扩范围
|
|
22
|
+
- 编译告警必须全部处理,禁止忽略(设置 -Werror 或 CI 编译告警数阈值)
|
|
23
|
+
- 代码提交前必须本地通过编译和单元测试,禁止把明显错误提交到远端
|
|
24
|
+
- 依赖升级必须逐个进行并验证,禁止批量升级多个依赖
|
|
25
|
+
- 线上配置变更必须通过配置中心(Nacos/Apollo),禁止直接修改配置文件重启
|
|
26
|
+
- 每次发布必须有回滚方案和验证清单,不能"改了就上线"
|
|
27
|
+
|
|
28
|
+
## 验收项
|
|
29
|
+
- [AC-01] 代码变更可追溯到任务或缺陷
|
|
30
|
+
- [AC-02] 推论与事实有显式区分标记
|
|
31
|
+
- [AC-03] 缺陷修复有执行证据
|
|
32
|
+
- [AC-04] 复发缺陷有防复发规则
|
|
33
|
+
- [AC-05] 运行时证据替代 dry-run/AI 摘要
|
|
34
|
+
- [AC-06] 自动修复循环未超过 3 轮
|
|
35
|
+
- [AC-07] 超范围变更有上报记录
|
|
36
|
+
- [AC-08] 编译告警全部处理
|
|
37
|
+
- [AC-09] 提交前本地验证
|
|
38
|
+
- [AC-10] 依赖逐个升级
|
|
39
|
+
- [AC-11] 发布有回滚方案
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concurrency-control
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 并发控制, 并发, 锁, 乐观锁, 悲观锁, 分布式锁, 竞态条件, 超卖, 库存扣减, 重复提交, 原子操作, 幂等, 去重
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 涉及金额、库存、配额、计数器等可变共享状态的操作必须显式声明并发控制策略
|
|
11
|
+
- 乐观锁适用于读多写少场景(版本号字段 + CAS),悲观锁适用于写多竞争激烈场景(SELECT FOR UPDATE)
|
|
12
|
+
- 分布式环境必须使用分布式锁(Redis SETNX / Redisson / ZooKeeper),禁止依赖 JVM 级锁跨实例
|
|
13
|
+
- 锁粒度必须最小化:锁具体资源而非整个表,锁业务 ID 而非全局锁
|
|
14
|
+
- 分布式锁必须设置超时时间(防止死锁),建议默认 30 秒
|
|
15
|
+
- 幂等方案优先于加锁:唯一约束、去重表、Token 机制比分布式锁更可靠
|
|
16
|
+
- 超卖/超扣场景必须使用数据库原子操作(UPDATE SET stock = stock - 1 WHERE stock >= 1),禁止先查后改
|
|
17
|
+
- 乐观锁冲突必须有用户可见提示("数据已被修改,请刷新重试"),禁止静默失败
|
|
18
|
+
- 批量并发操作必须限制并发度(信号量/线程池),禁止无限制并发
|
|
19
|
+
- ThreadLocal 必须在请求结束时 remove(),否则线程池复用导致数据串线
|
|
20
|
+
- 锁的获取和释放必须在同一个 try-finally 块中,防止异常导致死锁
|
|
21
|
+
- 分布式锁必须设置过期时间(如 30s),防止持有者崩溃导致永久死锁
|
|
22
|
+
- 原子操作优先使用 CAS(AtomicInteger/LongAdder),无竞争场景性能优于锁
|
|
23
|
+
- 线程池必须通过 ThreadPoolExecutor 构造函数创建,禁止使用 Executors(避免 OOM)
|
|
24
|
+
|
|
25
|
+
## 验收项
|
|
26
|
+
- [AC-01] 共享可变状态操作有显式并发控制策略
|
|
27
|
+
- [AC-02] 分布式锁有超时设置
|
|
28
|
+
- [AC-03] 超卖场景使用原子操作而非先查后改
|
|
29
|
+
- [AC-04] 乐观锁冲突有用户提示
|
|
30
|
+
- [AC-05] 批量并发操作有并发度限制
|
|
31
|
+
- [AC-06] ThreadLocal 请求结束清理
|
|
32
|
+
- [AC-07] 锁释放 try-finally 保护
|
|
33
|
+
- [AC-08] 分布式锁有超时时间
|
|
34
|
+
- [AC-09] 线程池显式创建
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: async-export
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 异步导出, 数据导出, 批量导出, 报表导出, CSV, Excel, PDF, 下载, 文件导出, 导出功能
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 超过 1000 条数据必须走异步导出,返回任务 ID
|
|
11
|
+
- 异步导出任务必须有状态追踪(PENDING/PROCESSING/COMPLETED/FAILED)
|
|
12
|
+
- 导出文件必须存储在对象存储,禁止堆积在本地磁盘
|
|
13
|
+
- 导出文件必须设置过期时间(建议 24 小时),到期自动清理
|
|
14
|
+
- 导出文件必须包含表头行,字段名对齐业务术语
|
|
15
|
+
- 大数据量导出必须异步执行,通过 WebSocket/轮询通知完成状态
|
|
16
|
+
- 导出数据量必须有上限(如单次 ≤ 100 万行),超限提示用户缩小范围
|
|
17
|
+
- 导出过程必须有进度反馈(已完成 X/Y 条),提升用户体验
|
|
18
|
+
- 导出失败必须通知用户并提供重试机制
|
|
19
|
+
|
|
20
|
+
## 验收项
|
|
21
|
+
- [AC-01] 大数据量走异步导出返回任务 ID
|
|
22
|
+
- [AC-02] 任务有状态追踪
|
|
23
|
+
- [AC-03] 文件 24 小时内自动清理
|
|
24
|
+
- [AC-04] 导出文件含表头行
|
|
25
|
+
- [AC-05] 大导出异步执行并有通知
|
|
26
|
+
- [AC-06] 导出文件有过期清理
|
|
27
|
+
- [AC-07] 有进度反馈
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: interface-contract
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 接口文档, API文档, 接口契约, Swagger, 接口定义, 接口规范, 字段定义, 接口评审
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 每个接口必须有完整定义:路径、方法、认证、请求、响应、错误码
|
|
11
|
+
- 页面交互与接口必须有映射表确保一一对应
|
|
12
|
+
- 每个接口至少定义:校验失败、权限不足、业务异常、资源不存在四种错误
|
|
13
|
+
- 所有枚举字段必须列出完整值集和含义,禁止无枚举定义的 type/status/flag 字段
|
|
14
|
+
- 每个接口必须显式声明幂等性和认证属性
|
|
15
|
+
- 接口契约中鉴权要求必须能回链到角色与权限模型
|
|
16
|
+
- 接口文档必须与代码同步更新,禁止文档与实现不一致
|
|
17
|
+
- 破坏性变更必须通过版本号隔离(如 /v1/ → /v2/),保证旧客户端兼容
|
|
18
|
+
- 接口响应时间必须有 SLA 约定(如 P99 < 500ms),超时触发告警
|
|
19
|
+
- 接口必须定义错误码体系(业务错误码 + HTTP 状态码),客户端可区分处理
|
|
20
|
+
- 接口变更必须通知所有消费方,并给予充足的迁移时间
|
|
21
|
+
|
|
22
|
+
## 验收项
|
|
23
|
+
- [AC-01] 接口文档包含完整定义(路径/方法/认证/请求/响应/错误)
|
|
24
|
+
- [AC-02] 页面交互与接口有映射表
|
|
25
|
+
- [AC-03] 枚举字段有完整值集定义
|
|
26
|
+
- [AC-04] 接口声明了幂等性和认证属性
|
|
27
|
+
- [AC-05] 文档与代码同步
|
|
28
|
+
- [AC-06] 破坏性变更版本隔离
|
|
29
|
+
- [AC-07] 有 SLA 约定和监控
|
|
30
|
+
- [AC-08] 错误码体系完整
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: search-pattern
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 搜索, 全文搜索, 搜索功能, 筛选, 过滤, 查询条件, 多条件查询, 动态查询, Elasticsearch, 搜索引擎, 模糊搜索
|
|
5
|
+
scope: [backend, frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 列表筛选条件超过 3 个必须封装为 SearchRequest 对象,禁止平铺查询参数
|
|
11
|
+
- 动态查询必须使用 MyBatis 动态 SQL 或 JPA Specification,禁止字符串拼接 SQL
|
|
12
|
+
- 模糊搜索(LIKE)必须考虑前缀匹配和索引利用,禁止全表扫描 `%keyword%`
|
|
13
|
+
- 大数据量全文搜索必须使用 Elasticsearch,禁止数据库 LIKE 性能瓶颈
|
|
14
|
+
- 搜索结果必须分页,禁止返回全量匹配结果
|
|
15
|
+
- 搜索条件组合必须明确 AND/OR 语义,禁止歧义
|
|
16
|
+
- 搜索接口响应时间目标 < 200ms,超过时必须优化(索引/缓存/ES)
|
|
17
|
+
- 前端搜索框必须有防抖(建议 300ms),禁止每次按键触发请求
|
|
18
|
+
- 搜索接口必须支持分页,禁止无限制返回结果
|
|
19
|
+
- 搜索结果必须高亮关键词,提升用户定位效率
|
|
20
|
+
- 搜索字段必须建立索引(Elasticsearch mapping 或数据库索引),禁止全表扫描
|
|
21
|
+
- 搜索关键词必须做长度限制和特殊字符过滤,防止恶意查询
|
|
22
|
+
- 搜索结果必须按相关度排序,支持用户自定义排序条件
|
|
23
|
+
|
|
24
|
+
## 验收项
|
|
25
|
+
- [AC-01] 筛选条件封装为对象
|
|
26
|
+
- [AC-02] 动态查询无 SQL 拼接
|
|
27
|
+
- [AC-03] 搜索结果分页
|
|
28
|
+
- [AC-04] 搜索接口响应 < 200ms
|
|
29
|
+
- [AC-05] 前端搜索有防抖
|
|
30
|
+
- [AC-06] 搜索接口分页
|
|
31
|
+
- [AC-07] 关键词高亮
|
|
32
|
+
- [AC-08] 搜索字段有索引
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: data-privacy
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 数据隐私, 脱敏, 敏感数据, 个人信息, PII, GDPR, 数据保护, 数据安全, 手机号, 身份证, 银行卡, 数据加密
|
|
5
|
+
scope: [backend, frontend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 手机号、身份证号、银行卡号、邮箱、地址等 PII 字段必须脱敏展示(手机号 138****1234,身份证 310***********1234)
|
|
11
|
+
- 数据库中密码必须 BCrypt 哈希,身份证/银行卡等必须 AES 加密存储,禁止明文
|
|
12
|
+
- 日志中禁止打印完整 PII 字段,必须脱敏或掩码处理
|
|
13
|
+
- 接口响应中敏感字段必须默认脱敏,需要明文的场景必须单独授权接口
|
|
14
|
+
- 数据导出(Excel/CSV)包含 PII 字段时必须有权限控制和操作审计
|
|
15
|
+
- 用户注销/数据删除请求必须级联清理所有关联 PII 数据,包括备份中的软删除标记
|
|
16
|
+
- 数据查询接口禁止支持全量导出 PII 数据,必须分页且有导出上限
|
|
17
|
+
- 前端禁止在 URL 参数、LocalStorage 明文存储敏感信息
|
|
18
|
+
- 个人敏感信息(身份证、手机号、银行卡)存储必须加密或脱敏
|
|
19
|
+
- 数据删除必须支持真删除(不只是软删除标记),满足 GDPR/个人信息保护法要求
|
|
20
|
+
- 用户注销必须清除或匿名化关联个人数据,不能只禁用账号
|
|
21
|
+
- 用户数据导出必须经过审批,导出文件必须加密传输
|
|
22
|
+
|
|
23
|
+
## 验收项
|
|
24
|
+
- [AC-01] PII 字段展示时有脱敏处理
|
|
25
|
+
- [AC-02] 敏感字段加密存储非明文
|
|
26
|
+
- [AC-03] 日志不含完整 PII 数据
|
|
27
|
+
- [AC-04] 数据导出有权限控制和审计
|
|
28
|
+
- [AC-05] 用户注销关联数据已清理
|
|
29
|
+
- [AC-06] 敏感信息加密存储
|
|
30
|
+
- [AC-07] 接口/日志中敏感信息脱敏
|
|
31
|
+
- [AC-08] 支持数据真删除和匿名化
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: file-upload
|
|
3
|
+
type: pattern
|
|
4
|
+
when: 文件上传, 上传文件, 文件存储, OSS, 图片上传, 附件上传, multipart, 文件下载, 对象存储
|
|
5
|
+
scope: [backend]
|
|
6
|
+
products: ["*"]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 决策规则
|
|
10
|
+
- 文件必须存储到对象存储(OSS/MinIO/S3),禁止存本地磁盘
|
|
11
|
+
- 必须校验文件类型白名单(禁止 .exe/.sh/.jsp 等)
|
|
12
|
+
- 必须限制文件大小(默认 10MB)
|
|
13
|
+
- 禁止使用原始文件名,必须 UUID 重命名防路径遍历
|
|
14
|
+
- 上传接口必须校验文件 MIME 类型和扩展名双重验证
|
|
15
|
+
- 图片类上传必须校验实际文件头(magic bytes),不能只依赖扩展名
|
|
16
|
+
- 必须配置上传文件总容量限制(单个用户/租户),防止存储滥用
|
|
17
|
+
- 下载链接必须使用签名 URL 或一次性 token,禁止永久公开 URL
|
|
18
|
+
- 禁止上传目录有执行权限(chmod -x),防止上传的脚本被服务器执行
|
|
19
|
+
- 文件上传必须异步处理(先上传再后台扫描),大文件必须支持断点续传
|
|
20
|
+
- 必须记录文件上传/下载审计日志(操作人、时间、文件名、大小)
|
|
21
|
+
|
|
22
|
+
## 验收项
|
|
23
|
+
- [AC-01] 文件类型白名单校验
|
|
24
|
+
- [AC-02] 文件大小限制(默认 10MB)
|
|
25
|
+
- [AC-03] UUID 重命名文件
|
|
26
|
+
- [AC-04] 存储在对象存储而非本地磁盘
|
|
27
|
+
- [AC-05] 文件头 magic bytes 校验
|
|
28
|
+
- [AC-06] 用户/租户存储容量限制
|
|
29
|
+
- [AC-07] 下载链接签名或一次性 token
|
|
30
|
+
- [AC-08] 上传目录无执行权限
|
|
31
|
+
- [AC-09] 上传/下载审计日志
|