List 列出所有计划文件
()
| 111 | |
| 112 | // List 列出所有计划文件 |
| 113 | func (m *PlanFileManager) List() ([]PlanFileMetadata, error) { |
| 114 | m.mu.RLock() |
| 115 | defer m.mu.RUnlock() |
| 116 | |
| 117 | entries, err := os.ReadDir(m.basePath) |
| 118 | if err != nil { |
| 119 | if os.IsNotExist(err) { |
| 120 | return []PlanFileMetadata{}, nil |
| 121 | } |
| 122 | return nil, fmt.Errorf("failed to read plans directory: %w", err) |
| 123 | } |
| 124 | |
| 125 | var plans []PlanFileMetadata |
| 126 | for _, entry := range entries { |
| 127 | if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".md") { |
| 128 | continue |
| 129 | } |
| 130 | |
| 131 | info, err := entry.Info() |
| 132 | if err != nil { |
| 133 | continue |
| 134 | } |
| 135 | |
| 136 | name := strings.TrimSuffix(entry.Name(), ".md") |
| 137 | plans = append(plans, PlanFileMetadata{ |
| 138 | ID: name, |
| 139 | Name: name, |
| 140 | Path: filepath.Join(m.basePath, entry.Name()), |
| 141 | CreatedAt: info.ModTime(), // 使用修改时间作为近似值 |
| 142 | UpdatedAt: info.ModTime(), |
| 143 | Status: "active", |
| 144 | }) |
| 145 | } |
| 146 | |
| 147 | return plans, nil |
| 148 | } |
| 149 | |
| 150 | // Delete 删除计划文件 |
| 151 | func (m *PlanFileManager) Delete(path string) error { |