Skip to content

Commit 2b83cc2

Browse files
tae2089claude
andcommitted
feat: add ProjectDesc field to ragindex.Builder for root node summary
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 5726aa1 commit 2b83cc2

6 files changed

Lines changed: 46 additions & 9 deletions

File tree

cmd/ccg/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ func runServe(deps *cli.Deps, cfg cli.ServeConfig) error {
157157
Logger: deps.Logger,
158158
Cache: cache,
159159
RagIndexDir: viper.GetString("rag.index_dir"),
160+
RagProjectDesc: viper.GetString("description"),
160161
}
161162

162163
srv := mcpserver.NewServer(mcpDeps)

internal/cli/ragindex.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
func newRagIndexCmd(deps *Deps) *cobra.Command {
1515
var outDir string
1616
var indexDir string
17+
var projectDesc string
1718

1819
cmd := &cobra.Command{
1920
Use: "rag-index",
@@ -25,9 +26,10 @@ func newRagIndexCmd(deps *Deps) *cobra.Command {
2526
}
2627

2728
b := &ragindex.Builder{
28-
DB: deps.DB,
29-
OutDir: resolveOutDir(outDir),
30-
IndexDir: indexDir,
29+
DB: deps.DB,
30+
OutDir: resolveOutDir(outDir),
31+
IndexDir: indexDir,
32+
ProjectDesc: projectDesc,
3133
}
3234

3335
communities, files, err := b.Build()
@@ -54,6 +56,7 @@ func newRagIndexCmd(deps *Deps) *cobra.Command {
5456

5557
cmd.Flags().StringVar(&outDir, "out", "docs", "Documentation directory")
5658
cmd.Flags().StringVar(&indexDir, "index-dir", ".ccg", "Directory for doc-index.json output")
59+
cmd.Flags().StringVar(&projectDesc, "desc", "", "Project description for root node summary")
5760

5861
return cmd
5962
}

internal/mcp/handlers.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,9 +1366,10 @@ func (h *handlers) buildRagIndex(ctx context.Context, request mcp.CallToolReques
13661366
}
13671367

13681368
b := &ragindex.Builder{
1369-
DB: h.deps.DB,
1370-
OutDir: outDir, // empty string → Builder uses "docs" default
1371-
IndexDir: indexDir, // empty string → Builder uses ".ccg" default
1369+
DB: h.deps.DB,
1370+
OutDir: outDir, // empty string → Builder uses "docs" default
1371+
IndexDir: indexDir, // empty string → Builder uses ".ccg" default
1372+
ProjectDesc: h.deps.RagProjectDesc,
13721373
}
13731374
communities, files, err := b.Build()
13741375
if err != nil {

internal/mcp/server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ type Deps struct {
9494

9595
// RagIndexDir — doc-index.json이 저장되는 디렉토리 (기본: ".ccg")
9696
RagIndexDir string
97+
// RagProjectDesc — root 노드 summary에 사용되는 프로젝트 설명
98+
RagProjectDesc string
9799
}
98100

99101
func NewServer(deps *Deps) *server.MCPServer {

internal/ragindex/builder.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ type Index struct {
3333

3434
// Builder는 DB에서 인덱스를 빌드하는 구조체이다.
3535
type Builder struct {
36-
DB *gorm.DB
37-
OutDir string // docs 디렉토리 (기본: "docs")
38-
IndexDir string // .ccg 디렉토리 (기본: ".ccg")
36+
DB *gorm.DB
37+
OutDir string // docs 디렉토리 (기본: "docs")
38+
IndexDir string // .ccg 디렉토리 (기본: ".ccg")
39+
ProjectDesc string // root 노드 summary (기본: "")
3940
}
4041

4142
// indexDir는 IndexDir 필드의 기본값을 반환한다.
@@ -97,6 +98,7 @@ func (b *Builder) Build() (int, int, error) {
9798
root := &TreeNode{
9899
ID: "root",
99100
Label: "Root",
101+
Summary: b.ProjectDesc,
100102
Children: []*TreeNode{},
101103
}
102104

internal/ragindex/builder_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,34 @@ func TestBuilder_WritesJSON(t *testing.T) {
300300
}
301301
}
302302

303+
// TestBuilder_ProjectDesc: ProjectDesc 설정 시 root.Summary에 반영됨을 검증한다.
304+
func TestBuilder_ProjectDesc(t *testing.T) {
305+
db := setupDB(t)
306+
tmpDir := t.TempDir()
307+
308+
b := &ragindex.Builder{
309+
DB: db,
310+
OutDir: filepath.Join(tmpDir, "docs"),
311+
IndexDir: filepath.Join(tmpDir, ".ccg"),
312+
ProjectDesc: "테스트 프로젝트 설명",
313+
}
314+
315+
_, _, err := b.Build()
316+
if err != nil {
317+
t.Fatalf("Build: %v", err)
318+
}
319+
320+
idxPath := filepath.Join(tmpDir, ".ccg", "doc-index.json")
321+
idx, err := ragindex.LoadIndex(idxPath)
322+
if err != nil {
323+
t.Fatalf("LoadIndex: %v", err)
324+
}
325+
326+
if idx.Root.Summary != "테스트 프로젝트 설명" {
327+
t.Errorf("root.Summary = %q, want %q", idx.Root.Summary, "테스트 프로젝트 설명")
328+
}
329+
}
330+
303331
// TestFindNode: FindNode가 재귀적으로 트리에서 노드를 찾는지 검증한다.
304332
func TestFindNode(t *testing.T) {
305333
root := &ragindex.TreeNode{

0 commit comments

Comments
 (0)