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,471 @@
|
|
|
1
|
+
// ── API contract file path keywords ──
|
|
2
|
+
const API_PATH_KEYWORDS = [
|
|
3
|
+
"controller",
|
|
4
|
+
"route",
|
|
5
|
+
"api",
|
|
6
|
+
"dto",
|
|
7
|
+
"request",
|
|
8
|
+
"response",
|
|
9
|
+
"model",
|
|
10
|
+
"entity",
|
|
11
|
+
"schema",
|
|
12
|
+
];
|
|
13
|
+
// ── Main function ──
|
|
14
|
+
export async function checkContractChanges(input) {
|
|
15
|
+
const { changedFiles, projectPath, config, gitOps } = input;
|
|
16
|
+
const changes = [];
|
|
17
|
+
// Filter to API-contract-relevant files
|
|
18
|
+
const contractFiles = changedFiles.filter((f) => isApiContractFile(f));
|
|
19
|
+
if (contractFiles.length === 0) {
|
|
20
|
+
return emptyResult("No API contract files changed.");
|
|
21
|
+
}
|
|
22
|
+
// Collect diffs for each contract file
|
|
23
|
+
const diffs = [];
|
|
24
|
+
for (const file of contractFiles) {
|
|
25
|
+
try {
|
|
26
|
+
const diff = await gitOps.getDiffPatch(projectPath, file, {
|
|
27
|
+
cached: true,
|
|
28
|
+
});
|
|
29
|
+
if (diff.trim()) {
|
|
30
|
+
diffs.push({ file, diff });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Skip files whose diff cannot be retrieved
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (diffs.length === 0) {
|
|
38
|
+
return emptyResult("No diff content found in API contract files.");
|
|
39
|
+
}
|
|
40
|
+
// Parse each diff for contract changes
|
|
41
|
+
for (const { file, diff } of diffs) {
|
|
42
|
+
const parsed = parseDiffForContractChanges(file, diff);
|
|
43
|
+
changes.push(...parsed);
|
|
44
|
+
}
|
|
45
|
+
// Tally
|
|
46
|
+
const breaking = changes.filter((c) => c.severity === "breaking");
|
|
47
|
+
const compatible = changes.filter((c) => c.severity === "compatible");
|
|
48
|
+
// Cross-service impact analysis
|
|
49
|
+
const crossServiceImpact = analyzeCrossServiceImpact(breaking, config);
|
|
50
|
+
const summary = buildSummary(changes.length, breaking.length, compatible.length, crossServiceImpact);
|
|
51
|
+
return {
|
|
52
|
+
changes,
|
|
53
|
+
breaking_count: breaking.length,
|
|
54
|
+
compatible_count: compatible.length,
|
|
55
|
+
cross_service_impact: crossServiceImpact,
|
|
56
|
+
requires_review: breaking.length > 0,
|
|
57
|
+
summary,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ── File classification ──
|
|
61
|
+
function isApiContractFile(filePath) {
|
|
62
|
+
const lower = filePath.toLowerCase();
|
|
63
|
+
return API_PATH_KEYWORDS.some((kw) => lower.includes(kw));
|
|
64
|
+
}
|
|
65
|
+
// ── Diff parsing ──
|
|
66
|
+
function parseDiffForContractChanges(file, diff) {
|
|
67
|
+
const changes = [];
|
|
68
|
+
const lines = diff.split("\n");
|
|
69
|
+
const consumedIndices = new Set();
|
|
70
|
+
for (let i = 0; i < lines.length; i++) {
|
|
71
|
+
if (consumedIndices.has(i))
|
|
72
|
+
continue;
|
|
73
|
+
const line = lines[i];
|
|
74
|
+
// Only look at added/removed lines (skip diff metadata headers)
|
|
75
|
+
const isAdded = line.startsWith("+") && !line.startsWith("+++");
|
|
76
|
+
const isRemoved = line.startsWith("-") && !line.startsWith("---");
|
|
77
|
+
if (!isAdded && !isRemoved)
|
|
78
|
+
continue;
|
|
79
|
+
const content = line.slice(1); // strip leading +/- (and the space)
|
|
80
|
+
// Spring MVC annotations
|
|
81
|
+
const springChange = detectSpringAnnotationChange(content, isAdded, isRemoved, file);
|
|
82
|
+
if (springChange) {
|
|
83
|
+
changes.push(springChange);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Express route definitions
|
|
87
|
+
const expressChange = detectExpressRouteChange(content, isAdded, isRemoved, file);
|
|
88
|
+
if (expressChange) {
|
|
89
|
+
changes.push(expressChange);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// DTO/Entity field changes
|
|
93
|
+
const fieldChange = detectFieldChange(content, isAdded, isRemoved, file, lines, i, consumedIndices);
|
|
94
|
+
if (fieldChange) {
|
|
95
|
+
changes.push(fieldChange);
|
|
96
|
+
// If field_type_changed detected, skip ahead for the related + line
|
|
97
|
+
if (fieldChange.change_type === "field_type_changed" && isRemoved) {
|
|
98
|
+
// We already consumed context; continue normally
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Post-process: detect HTTP method changes on same path
|
|
103
|
+
// Pair path_removed + path_added with the same URL path into method_changed
|
|
104
|
+
const methodChanged = detectMethodChanges(changes);
|
|
105
|
+
return methodChanged;
|
|
106
|
+
}
|
|
107
|
+
// ── HTTP method change detection ──
|
|
108
|
+
function detectMethodChanges(changes) {
|
|
109
|
+
const removed = new Map();
|
|
110
|
+
const added = new Map();
|
|
111
|
+
const consumed = new Set();
|
|
112
|
+
// Index removed and added path changes by their URL path
|
|
113
|
+
for (let i = 0; i < changes.length; i++) {
|
|
114
|
+
const change = changes[i];
|
|
115
|
+
if (change.change_type === "path_removed") {
|
|
116
|
+
const pathStr = extractPath(change.before ?? change.description);
|
|
117
|
+
if (pathStr)
|
|
118
|
+
removed.set(pathStr, change);
|
|
119
|
+
}
|
|
120
|
+
else if (change.change_type === "path_added") {
|
|
121
|
+
const pathStr = extractPath(change.after ?? change.description);
|
|
122
|
+
if (pathStr)
|
|
123
|
+
added.set(pathStr, change);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Find matching pairs (same URL path, different HTTP method)
|
|
127
|
+
const result = [];
|
|
128
|
+
for (const [urlPath, removedChange] of removed) {
|
|
129
|
+
const addedChange = added.get(urlPath);
|
|
130
|
+
if (addedChange) {
|
|
131
|
+
// Extract HTTP methods
|
|
132
|
+
const removedMethod = extractHttpMethod(removedChange.before ?? removedChange.description);
|
|
133
|
+
const addedMethod = extractHttpMethod(addedChange.after ?? addedChange.description);
|
|
134
|
+
if (removedMethod && addedMethod && removedMethod !== addedMethod) {
|
|
135
|
+
consumed.add(changes.indexOf(removedChange));
|
|
136
|
+
consumed.add(changes.indexOf(addedChange));
|
|
137
|
+
result.push({
|
|
138
|
+
file: removedChange.file,
|
|
139
|
+
change_type: "method_changed",
|
|
140
|
+
severity: "breaking",
|
|
141
|
+
description: `HTTP method changed: ${removedMethod} ${urlPath} -> ${addedMethod} ${urlPath}`,
|
|
142
|
+
before: `${removedMethod} ${urlPath}`,
|
|
143
|
+
after: `${addedMethod} ${urlPath}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Return method_changed + any unconsumed changes
|
|
149
|
+
for (let i = 0; i < changes.length; i++) {
|
|
150
|
+
if (!consumed.has(i)) {
|
|
151
|
+
result.push(changes[i]);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
function extractPath(endpointStr) {
|
|
157
|
+
// Extract URL path from strings like "GetMapping /api/v1/users" or "GET /api/v1/users"
|
|
158
|
+
const match = endpointStr.match(/\/[\w\-{}./]+/);
|
|
159
|
+
return match ? match[0] : null;
|
|
160
|
+
}
|
|
161
|
+
function extractHttpMethod(endpointStr) {
|
|
162
|
+
// Extract HTTP method from strings like "GetMapping /api/v1/users" or "GET /api/v1/users"
|
|
163
|
+
const match = endpointStr.match(/^(Get|Post|Put|Delete|Patch|Mapping)\w*\s/i);
|
|
164
|
+
if (match) {
|
|
165
|
+
const raw = match[1].toUpperCase();
|
|
166
|
+
// Map Spring annotation names to HTTP methods
|
|
167
|
+
const methodMap = {
|
|
168
|
+
GET: "GET", POST: "POST", PUT: "PUT", DELETE: "DELETE", PATCH: "PATCH",
|
|
169
|
+
REQUESTMAPPING: "REQUEST",
|
|
170
|
+
};
|
|
171
|
+
return methodMap[raw] ?? raw;
|
|
172
|
+
}
|
|
173
|
+
// Try uppercase HTTP method
|
|
174
|
+
const httpMatch = endpointStr.match(/^(GET|POST|PUT|DELETE|PATCH)\s/);
|
|
175
|
+
return httpMatch ? httpMatch[1] : null;
|
|
176
|
+
}
|
|
177
|
+
// ── Spring annotation detection ──
|
|
178
|
+
function detectSpringAnnotationChange(content, isAdded, isRemoved, file) {
|
|
179
|
+
const springAnnotationRe = /^\s*@(?<method>RequestMapping|GetMapping|PostMapping|PutMapping|DeleteMapping)\s*\(?\s*(?:value\s*=\s*)?["'`](?<path>\/[^"'`]*)["'`]/;
|
|
180
|
+
const match = content.match(springAnnotationRe);
|
|
181
|
+
if (!match)
|
|
182
|
+
return null;
|
|
183
|
+
const path = match.groups.path;
|
|
184
|
+
const httpMethod = match.groups.method;
|
|
185
|
+
if (isAdded) {
|
|
186
|
+
return {
|
|
187
|
+
file,
|
|
188
|
+
change_type: "path_added",
|
|
189
|
+
severity: "compatible",
|
|
190
|
+
description: `New endpoint added: ${httpMethod} ${path}`,
|
|
191
|
+
after: `${httpMethod} ${path}`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (isRemoved) {
|
|
195
|
+
return {
|
|
196
|
+
file,
|
|
197
|
+
change_type: "path_removed",
|
|
198
|
+
severity: "breaking",
|
|
199
|
+
description: `Endpoint removed: ${httpMethod} ${path}`,
|
|
200
|
+
before: `${httpMethod} ${path}`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
// ── Express route detection ──
|
|
206
|
+
function detectExpressRouteChange(content, isAdded, isRemoved, file) {
|
|
207
|
+
const expressRouteRe = /router\.(?<method>get|post|put|delete|patch)\s*\(\s*['"`](?<path>\/[^'"`]*)['"`]/;
|
|
208
|
+
const match = content.match(expressRouteRe);
|
|
209
|
+
if (!match)
|
|
210
|
+
return null;
|
|
211
|
+
const path = match.groups.path;
|
|
212
|
+
const httpMethod = match.groups.method.toUpperCase();
|
|
213
|
+
if (isAdded) {
|
|
214
|
+
return {
|
|
215
|
+
file,
|
|
216
|
+
change_type: "path_added",
|
|
217
|
+
severity: "compatible",
|
|
218
|
+
description: `New Express route added: ${httpMethod} ${path}`,
|
|
219
|
+
after: `${httpMethod} ${path}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (isRemoved) {
|
|
223
|
+
return {
|
|
224
|
+
file,
|
|
225
|
+
change_type: "path_removed",
|
|
226
|
+
severity: "breaking",
|
|
227
|
+
description: `Express route removed: ${httpMethod} ${path}`,
|
|
228
|
+
before: `${httpMethod} ${path}`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
// ── Field change detection ──
|
|
234
|
+
function detectFieldChange(content, isAdded, isRemoved, file, lines, currentIndex, consumedIndices) {
|
|
235
|
+
// Java: private Type fieldName;
|
|
236
|
+
const javaFieldRe = /^\s*(private|protected|public)\s+(?<type>[\w<>[\]]+)\s+(?<name>\w+)/;
|
|
237
|
+
// TypeScript: fieldName: Type; or fieldName?: Type;
|
|
238
|
+
const tsFieldRe = /^\s*(?<name>\w+)\s*(?<optional>\??):\s*(?<type>[\w<>[\]|.]+)\s*[;=]?/;
|
|
239
|
+
const javaMatch = content.match(javaFieldRe);
|
|
240
|
+
const tsMatch = !javaMatch ? content.match(tsFieldRe) : null;
|
|
241
|
+
if (javaMatch) {
|
|
242
|
+
const { type, name } = javaMatch.groups;
|
|
243
|
+
const fieldName = `${name}: ${type}`;
|
|
244
|
+
if (isAdded) {
|
|
245
|
+
// Check if there's a preceding - line with the same field name (type change detection)
|
|
246
|
+
const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
|
|
247
|
+
if (typeChange) {
|
|
248
|
+
return {
|
|
249
|
+
file,
|
|
250
|
+
change_type: "field_type_changed",
|
|
251
|
+
severity: "breaking",
|
|
252
|
+
description: `Field type changed: ${name}`,
|
|
253
|
+
before: typeChange.before,
|
|
254
|
+
after: typeChange.after,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
file,
|
|
259
|
+
change_type: "field_added",
|
|
260
|
+
severity: "compatible",
|
|
261
|
+
description: `Field added: ${fieldName}`,
|
|
262
|
+
after: fieldName,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
if (isRemoved) {
|
|
266
|
+
// Check if the next line is a similar field addition (type change detection)
|
|
267
|
+
const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
|
|
268
|
+
if (typeChange) {
|
|
269
|
+
return {
|
|
270
|
+
file,
|
|
271
|
+
change_type: "field_type_changed",
|
|
272
|
+
severity: "breaking",
|
|
273
|
+
description: `Field type changed: ${name}`,
|
|
274
|
+
before: typeChange.before,
|
|
275
|
+
after: typeChange.after,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
file,
|
|
280
|
+
change_type: "field_removed",
|
|
281
|
+
severity: "breaking",
|
|
282
|
+
description: `Field removed: ${fieldName}`,
|
|
283
|
+
before: fieldName,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (tsMatch) {
|
|
288
|
+
const { type, name } = tsMatch.groups;
|
|
289
|
+
const optional = tsMatch.groups.optional === "?";
|
|
290
|
+
const fieldName = `${name}${optional ? "?" : ""}: ${type}`;
|
|
291
|
+
if (isAdded) {
|
|
292
|
+
// Check if there's a preceding - line with the same field name (type change detection)
|
|
293
|
+
const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
|
|
294
|
+
if (typeChange) {
|
|
295
|
+
return {
|
|
296
|
+
file,
|
|
297
|
+
change_type: "field_type_changed",
|
|
298
|
+
severity: "breaking",
|
|
299
|
+
description: `Field type changed: ${name}`,
|
|
300
|
+
before: typeChange.before,
|
|
301
|
+
after: typeChange.after,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
file,
|
|
306
|
+
change_type: "field_added",
|
|
307
|
+
severity: "compatible",
|
|
308
|
+
description: `Field added: ${fieldName}`,
|
|
309
|
+
after: fieldName,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
if (isRemoved) {
|
|
313
|
+
const typeChange = detectTypeChangeForField(name, lines, currentIndex, consumedIndices);
|
|
314
|
+
if (typeChange) {
|
|
315
|
+
return {
|
|
316
|
+
file,
|
|
317
|
+
change_type: "field_type_changed",
|
|
318
|
+
severity: "breaking",
|
|
319
|
+
description: `Field type changed: ${name}`,
|
|
320
|
+
before: typeChange.before,
|
|
321
|
+
after: typeChange.after,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
file,
|
|
326
|
+
change_type: "field_removed",
|
|
327
|
+
severity: "breaking",
|
|
328
|
+
description: `Field removed: ${fieldName}`,
|
|
329
|
+
before: fieldName,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
// ── Type change detection (adjacent -/+ lines with same field name) ──
|
|
336
|
+
function detectTypeChangeForField(fieldName, lines, currentIndex, consumedIndices) {
|
|
337
|
+
const javaRe = /^\s*(private|protected|public)\s+(?<type>[\w<>[\]]+)\s+(?<name>\w+)/;
|
|
338
|
+
const tsRe = /^\s*(?<name>\w+)\s*(?<optional>\??):\s*(?<type>[\w<>[\]|.]+)\s*[;=]?/;
|
|
339
|
+
const currentLine = lines[currentIndex];
|
|
340
|
+
const isRemoved = currentLine.startsWith("-") && !currentLine.startsWith("---");
|
|
341
|
+
const isAdded = currentLine.startsWith("+") && !currentLine.startsWith("+++");
|
|
342
|
+
// Helper to extract type from a diff line content (after +/- prefix)
|
|
343
|
+
function extractTypeInfo(lineIndex) {
|
|
344
|
+
const line = lines[lineIndex];
|
|
345
|
+
const isPlus = line.startsWith("+") && !line.startsWith("+++");
|
|
346
|
+
const isMinus = line.startsWith("-") && !line.startsWith("---");
|
|
347
|
+
if (!isPlus && !isMinus)
|
|
348
|
+
return null;
|
|
349
|
+
const content = line.slice(1);
|
|
350
|
+
const jMatch = content.match(javaRe);
|
|
351
|
+
const tMatch = !jMatch ? content.match(tsRe) : null;
|
|
352
|
+
const m = jMatch ?? tMatch;
|
|
353
|
+
if (!m)
|
|
354
|
+
return null;
|
|
355
|
+
return { type: m.groups.type, name: m.groups.name };
|
|
356
|
+
}
|
|
357
|
+
function getCurrentTypeInfo() {
|
|
358
|
+
return extractTypeInfo(currentIndex);
|
|
359
|
+
}
|
|
360
|
+
const maxLook = 5;
|
|
361
|
+
if (isRemoved) {
|
|
362
|
+
// Look ahead for a + line with the same field name but different type
|
|
363
|
+
for (let j = currentIndex + 1; j < Math.min(currentIndex + maxLook, lines.length); j++) {
|
|
364
|
+
if (consumedIndices.has(j))
|
|
365
|
+
continue;
|
|
366
|
+
const info = extractTypeInfo(j);
|
|
367
|
+
if (info && info.name === fieldName) {
|
|
368
|
+
const currentInfo = getCurrentTypeInfo();
|
|
369
|
+
if (info.type !== currentInfo.type) {
|
|
370
|
+
consumedIndices.add(j);
|
|
371
|
+
return { before: `${fieldName}: ${currentInfo.type}`, after: `${fieldName}: ${info.type}` };
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Also look backward for a + line (when - comes after + in the diff)
|
|
376
|
+
for (let j = currentIndex - 1; j >= Math.max(0, currentIndex - maxLook); j--) {
|
|
377
|
+
if (consumedIndices.has(j))
|
|
378
|
+
continue;
|
|
379
|
+
const info = extractTypeInfo(j);
|
|
380
|
+
if (info && info.name === fieldName) {
|
|
381
|
+
const currentInfo = getCurrentTypeInfo();
|
|
382
|
+
if (info.type !== currentInfo.type) {
|
|
383
|
+
consumedIndices.add(j);
|
|
384
|
+
return { before: `${fieldName}: ${currentInfo.type}`, after: `${fieldName}: ${info.type}` };
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (isAdded) {
|
|
390
|
+
// Look backward for a - line with the same field name but different type
|
|
391
|
+
for (let j = currentIndex - 1; j >= Math.max(0, currentIndex - maxLook); j--) {
|
|
392
|
+
if (consumedIndices.has(j))
|
|
393
|
+
continue;
|
|
394
|
+
const info = extractTypeInfo(j);
|
|
395
|
+
if (info && info.name === fieldName) {
|
|
396
|
+
const currentInfo = getCurrentTypeInfo();
|
|
397
|
+
if (info.type !== currentInfo.type) {
|
|
398
|
+
consumedIndices.add(j);
|
|
399
|
+
return { before: `${fieldName}: ${info.type}`, after: `${fieldName}: ${currentInfo.type}` };
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Also look forward for a - line (when + comes before - in the diff)
|
|
404
|
+
for (let j = currentIndex + 1; j < Math.min(currentIndex + maxLook, lines.length); j++) {
|
|
405
|
+
if (consumedIndices.has(j))
|
|
406
|
+
continue;
|
|
407
|
+
const info = extractTypeInfo(j);
|
|
408
|
+
if (info && info.name === fieldName) {
|
|
409
|
+
const currentInfo = getCurrentTypeInfo();
|
|
410
|
+
if (info.type !== currentInfo.type) {
|
|
411
|
+
consumedIndices.add(j);
|
|
412
|
+
return { before: `${fieldName}: ${info.type}`, after: `${fieldName}: ${currentInfo.type}` };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
// ── Cross-service impact analysis ──
|
|
420
|
+
function analyzeCrossServiceImpact(breakingChanges, config) {
|
|
421
|
+
const impact = [];
|
|
422
|
+
// Only relevant if the project has multiple repos (multi-service)
|
|
423
|
+
if (config.repos.length < 2)
|
|
424
|
+
return impact;
|
|
425
|
+
// Extract impacted endpoint paths from breaking changes
|
|
426
|
+
const affectedEndpoints = [];
|
|
427
|
+
for (const change of breakingChanges) {
|
|
428
|
+
if (change.change_type === "path_removed" ||
|
|
429
|
+
change.change_type === "method_changed" ||
|
|
430
|
+
change.change_type === "field_removed" ||
|
|
431
|
+
change.change_type === "field_type_changed") {
|
|
432
|
+
const endpoint = change.before ?? change.description;
|
|
433
|
+
affectedEndpoints.push(endpoint);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (affectedEndpoints.length > 0) {
|
|
437
|
+
impact.push({
|
|
438
|
+
service: "frontend",
|
|
439
|
+
endpoints: affectedEndpoints,
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
return impact;
|
|
443
|
+
}
|
|
444
|
+
// ── Summary builder ──
|
|
445
|
+
function buildSummary(total, breaking, compatible, crossService) {
|
|
446
|
+
const parts = [];
|
|
447
|
+
if (total === 0) {
|
|
448
|
+
return "No contract changes detected.";
|
|
449
|
+
}
|
|
450
|
+
parts.push(`Detected ${total} contract change(s): ${breaking} breaking, ${compatible} compatible.`);
|
|
451
|
+
if (crossService.length > 0) {
|
|
452
|
+
const services = crossService.map((c) => `${c.service} (${c.endpoints.length} endpoint(s))`);
|
|
453
|
+
parts.push(`Cross-service impact: ${services.join(", ")}.`);
|
|
454
|
+
}
|
|
455
|
+
if (breaking > 0) {
|
|
456
|
+
parts.push("Review required due to breaking changes.");
|
|
457
|
+
}
|
|
458
|
+
return parts.join(" ");
|
|
459
|
+
}
|
|
460
|
+
// ── Empty result helper ──
|
|
461
|
+
function emptyResult(summary) {
|
|
462
|
+
return {
|
|
463
|
+
changes: [],
|
|
464
|
+
breaking_count: 0,
|
|
465
|
+
compatible_count: 0,
|
|
466
|
+
cross_service_impact: [],
|
|
467
|
+
requires_review: false,
|
|
468
|
+
summary,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=contract_guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract_guard.js","sourceRoot":"","sources":["../../src/engine/contract_guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface Convention {
|
|
2
|
+
file_pattern: string;
|
|
3
|
+
convention: string;
|
|
4
|
+
example?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function detectConventions(filePaths: string[], projectPath: string, conventionsFile?: string): Promise<Convention[]>;
|
|
7
|
+
//# sourceMappingURL=convention_detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention_detector.d.ts","sourceRoot":"","sources":["../../src/engine/convention_detector.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,UAAU,EAAE,CAAC,CA0CvB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import fss from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import matter from "gray-matter";
|
|
5
|
+
export async function detectConventions(filePaths, projectPath, conventionsFile) {
|
|
6
|
+
const conventions = [];
|
|
7
|
+
// 优先加载项目约定的惯例文件
|
|
8
|
+
if (conventionsFile) {
|
|
9
|
+
const convPath = path.resolve(projectPath, conventionsFile);
|
|
10
|
+
if (fss.existsSync(convPath)) {
|
|
11
|
+
try {
|
|
12
|
+
const raw = await fs.readFile(convPath, "utf-8");
|
|
13
|
+
const { data } = matter(raw);
|
|
14
|
+
if (Array.isArray(data.conventions)) {
|
|
15
|
+
for (const c of data.conventions) {
|
|
16
|
+
conventions.push({
|
|
17
|
+
file_pattern: c.pattern || c.file_pattern || "*",
|
|
18
|
+
convention: c.convention || c.rule || String(c),
|
|
19
|
+
example: c.example,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// 惯例文件解析失败,跳过
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
for (const filePath of filePaths) {
|
|
30
|
+
try {
|
|
31
|
+
const fullPath = path.resolve(projectPath, filePath);
|
|
32
|
+
const stat = await fs.stat(fullPath);
|
|
33
|
+
if (!stat.isFile())
|
|
34
|
+
continue;
|
|
35
|
+
const content = await fs.readFile(fullPath, "utf-8");
|
|
36
|
+
const detected = analyzeFile(content, filePath);
|
|
37
|
+
conventions.push(...detected);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// 文件无法访问,跳过
|
|
41
|
+
}
|
|
42
|
+
if (conventions.length >= 10)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
return conventions;
|
|
46
|
+
}
|
|
47
|
+
function analyzeFile(content, filePath) {
|
|
48
|
+
const conventions = [];
|
|
49
|
+
// 检测 Spring 惯例
|
|
50
|
+
if (filePath.endsWith(".java")) {
|
|
51
|
+
if (/private.*Map.*cache/.test(content)) {
|
|
52
|
+
conventions.push({
|
|
53
|
+
file_pattern: filePath,
|
|
54
|
+
convention: "Service 类包含缓存字段(Map 缓存),修改时遵循此模式",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (/@Transactional/.test(content) && !/readOnly\s*=\s*true/.test(content)) {
|
|
58
|
+
conventions.push({
|
|
59
|
+
file_pattern: filePath,
|
|
60
|
+
convention: "写操作使用 @Transactional,查询操作不加事务注解",
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (/class \w+ServiceImpl/.test(content)) {
|
|
64
|
+
conventions.push({
|
|
65
|
+
file_pattern: filePath,
|
|
66
|
+
convention: "使用 ServiceImpl 后缀命名实现类",
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 检测 React/TypeScript 惯例
|
|
71
|
+
if (/\.tsx?$/.test(filePath)) {
|
|
72
|
+
if (/export default/.test(content)) {
|
|
73
|
+
conventions.push({
|
|
74
|
+
file_pattern: filePath,
|
|
75
|
+
convention: "使用 export default 导出组件",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (/interface \w+Props/.test(content)) {
|
|
79
|
+
conventions.push({
|
|
80
|
+
file_pattern: filePath,
|
|
81
|
+
convention: "Props 使用 interface 定义(非 type)",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (/useStyles|makeStyles|styled/.test(content)) {
|
|
85
|
+
conventions.push({
|
|
86
|
+
file_pattern: filePath,
|
|
87
|
+
convention: "使用 CSS-in-JS 方案管理样式",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return conventions;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=convention_detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convention_detector.js","sourceRoot":"","sources":["../../src/engine/convention_detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debt_reporter.d.ts","sourceRoot":"","sources":["../../src/engine/debt_reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,aAAa,CAAC;AAyBxD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAyDlF"}
|