MCPcopy Create free account
hub / github.com/MiniCodeMonkey/chief / MigrateFromJSON

Function MigrateFromJSON

internal/prd/migrate.go:12–53  ·  view source on GitHub ↗

MigrateFromJSON reads prd.json, transfers story statuses into prd.md using SetStoryStatus, and renames prd.json to prd.json.bak.

(prdDir string)

Source from the content-addressed store, hash-verified

10// MigrateFromJSON reads prd.json, transfers story statuses into prd.md
11// using SetStoryStatus, and renames prd.json to prd.json.bak.
12func MigrateFromJSON(prdDir string) error {
13 jsonPath := filepath.Join(prdDir, "prd.json")
14 mdPath := filepath.Join(prdDir, "prd.md")
15
16 // Read and parse prd.json
17 data, err := os.ReadFile(jsonPath)
18 if err != nil {
19 return fmt.Errorf("failed to read prd.json: %w", err)
20 }
21
22 var p PRD
23 if err := json.Unmarshal(data, &p); err != nil {
24 return fmt.Errorf("failed to parse prd.json: %w", err)
25 }
26
27 // Check that prd.md exists
28 if _, err := os.Stat(mdPath); err != nil {
29 return fmt.Errorf("prd.md not found: %w", err)
30 }
31
32 // Transfer statuses
33 for _, story := range p.UserStories {
34 if story.Passes {
35 if err := SetStoryStatus(mdPath, story.ID, "done"); err != nil {
36 // Non-fatal: story might not exist in prd.md (was removed)
37 continue
38 }
39 } else if story.InProgress {
40 if err := SetStoryStatus(mdPath, story.ID, "in-progress"); err != nil {
41 continue
42 }
43 }
44 }
45
46 // Rename prd.json → prd.json.bak
47 bakPath := filepath.Join(prdDir, "prd.json.bak")
48 if err := os.Rename(jsonPath, bakPath); err != nil {
49 return fmt.Errorf("failed to rename prd.json to prd.json.bak: %w", err)
50 }
51
52 return nil
53}

Callers 5

runTUIWithOptionsFunction · 0.92
TestMigrateFromJSONFunction · 0.85

Calls 1

SetStoryStatusFunction · 0.85