Skip to content

Commit a75ae1b

Browse files
authored
Merge pull request #129 from SimplyLiz/develop
Release v8.1.0
2 parents 0621b69 + b6b5225 commit a75ae1b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+6425
-144
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ coverage.out
2121
# IDE
2222
.idea/
2323
.vscode/
24+
.cursor/
2425
*.swp
2526
*.swo
2627

CHANGELOG.md

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
All notable changes to CKB will be documented in this file.
44

5-
## [8.1.0] - Unreleased
5+
## [8.1.0] - 2026-01-31
66

77
### Added
88

@@ -61,6 +61,53 @@ The `--include-tests` flag now works end-to-end in `ckb impact diff`:
6161
- Properly sets `IsTest` flag on references based on file path
6262
- Filters test files from changed symbols when `--include-tests=false`
6363

64+
#### Dependency Cycle Detection (`findCycles`)
65+
Detect circular dependencies in module, directory, or file dependency graphs using Tarjan's SCC algorithm:
66+
67+
```bash
68+
# Via MCP
69+
findCycles { "granularity": "directory", "targetPath": "internal/" }
70+
```
71+
72+
- Uses Tarjan's strongly connected components to find real cycles
73+
- Recommends which edge to break (lowest coupling cost)
74+
- Severity classification: size ≥5 = high, ≥3 = medium, 2 = low
75+
- Available in `refactor` preset
76+
77+
#### Move/Relocate Change Type
78+
`prepareChange` and `planRefactor` now support `changeType: "move"` with a `targetPath` parameter:
79+
80+
```bash
81+
prepareChange { "target": "internal/old/handler.go", "changeType": "move", "targetPath": "pkg/handler.go" }
82+
```
83+
84+
- Scans all source files for import path references that need updating
85+
- Detects target directory conflicts (existing files with same name)
86+
- Generates move-specific refactoring steps in `planRefactor`
87+
88+
#### Extract Variable Flow Analysis
89+
`prepareChange` with `changeType: "extract"` now provides tree-sitter-based variable flow analysis when CGO is available:
90+
91+
- Identifies parameters (variables defined outside selection, used inside)
92+
- Identifies return values (variables defined inside, used after selection)
93+
- Classifies local variables (defined and consumed within selection)
94+
- Generates language-appropriate function signatures (Go, Python, JS/TS)
95+
- Graceful degradation: falls back to line-count heuristics without CGO
96+
97+
#### Suggested Refactoring Detection (`suggestRefactorings`)
98+
Proactive detection of refactoring opportunities by combining existing analyzers in parallel:
99+
100+
```bash
101+
suggestRefactorings { "scope": "internal/query", "minSeverity": "medium" }
102+
```
103+
104+
- **Complexity**: High cyclomatic/cognitive functions → `extract_function`, `simplify_function`
105+
- **Coupling**: Highly correlated file pairs → `reduce_coupling`, `split_file`
106+
- **Dead code**: Unused symbols → `remove_dead_code`
107+
- **Test gaps**: High-risk untested code → `add_tests`
108+
- Each suggestion includes severity, effort estimate, and priority score
109+
- Available in `refactor` preset
110+
64111
## [8.0.2] - 2026-01-22
65112
66113
### Added

cmd/ckb/mcp.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/SimplyLiz/CodeMCP/internal/index"
1616
"github.com/SimplyLiz/CodeMCP/internal/mcp"
1717
"github.com/SimplyLiz/CodeMCP/internal/project"
18+
"github.com/SimplyLiz/CodeMCP/internal/query"
1819
"github.com/SimplyLiz/CodeMCP/internal/repos"
1920
"github.com/SimplyLiz/CodeMCP/internal/repostate"
2021
"github.com/SimplyLiz/CodeMCP/internal/slogutil"
@@ -118,10 +119,9 @@ func runMCP(cmd *cobra.Command, args []string) error {
118119
repoName = mcpRepo
119120
fmt.Fprintf(os.Stderr, "Repository: %s (%s) [%s]\n", repoName, repoRoot, state)
120121

121-
// Use multi-repo mode
122-
server = mcp.NewMCPServerWithRegistry(version.Version, registry, logger)
123-
engine := mustGetEngine(repoRoot, logger)
124-
server.SetActiveRepo(repoName, repoRoot, engine)
122+
// Skip multi-repo mode - use lazy loading path instead
123+
// TODO: Add lazy loading support to multi-repo mode
124+
_ = registry // silence unused warning
125125
}
126126
} else {
127127
// No --repo flag - use smart resolution
@@ -160,13 +160,9 @@ func runMCP(cmd *cobra.Command, args []string) error {
160160
}
161161
}
162162

163-
// Use multi-repo mode if registry is available
164-
registry, err := repos.LoadRegistry()
165-
if err == nil && resolved.Source != repos.ResolvedFromCWDGit {
166-
server = mcp.NewMCPServerWithRegistry(version.Version, registry, logger)
167-
engine := mustGetEngine(repoRoot, logger)
168-
server.SetActiveRepo(repoName, repoRoot, engine)
169-
}
163+
// Skip multi-repo mode for now - use lazy loading path instead
164+
// TODO: Add lazy loading support to multi-repo mode
165+
_ = repos.LoadRegistry // silence unused warning
170166
} else {
171167
// No repo found - fall back to current directory
172168
repoRoot = mustGetRepoRoot()
@@ -199,11 +195,12 @@ func runMCP(cmd *cobra.Command, args []string) error {
199195
logger = slogutil.NewTeeLogger(fileLogger.Handler(), stderrHandler)
200196
}
201197

202-
// Create server if not already created (legacy single-engine mode)
203-
if server == nil {
204-
engine := mustGetEngine(repoRoot, logger)
205-
server = mcp.NewMCPServer(version.Version, engine, logger)
206-
}
198+
// Use lazy loading for fast MCP handshake
199+
// Capture repoRoot and logger for the closure
200+
root, log := repoRoot, logger
201+
server = mcp.NewMCPServerLazy(version.Version, func() (*query.Engine, error) {
202+
return getEngine(root, log)
203+
}, logger)
207204

208205
// Apply preset configuration
209206
if err := server.SetPreset(mcpPreset); err != nil {

0 commit comments

Comments
 (0)