Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .todo/tickets/95eb1fe7.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
id: 95eb1fe7
title: Define FileNode model (core-file-discovery TASK-02)
status: To Do
status: Done
created_at: 2026-06-05T02:38:57.829857104Z
transitions:
- from: To Do
to: In Progress
at: 2026-06-06T17:54:43.8554997Z
- from: In Progress
to: Done
at: 2026-06-06T17:55:42.363318717Z
9 changes: 8 additions & 1 deletion .todo/tickets/ec0653c4.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
id: ec0653c4
title: Implement recursive .md file discovery (core-file-discovery TASK-01)
status: To Do
status: Done
created_at: 2026-06-05T02:38:57.826481921Z
transitions:
- from: To Do
to: In Progress
at: 2026-06-06T17:48:09.34035645Z
- from: In Progress
to: Done
at: 2026-06-06T17:49:37.974735989Z
29 changes: 29 additions & 0 deletions Sources/Core/FileDiscovery.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import Foundation

public enum DiscoveryError: Error {
case notADirectory(URL)
}

public func discoverMarkdownFiles(in directoryURL: URL) throws -> [URL] {
var isDirectory: ObjCBool = false
guard FileManager.default.fileExists(atPath: directoryURL.path, isDirectory: &isDirectory),
isDirectory.boolValue else {
throw DiscoveryError.notADirectory(directoryURL)
}

let enumerator = FileManager.default.enumerator(
at: directoryURL,
includingPropertiesForKeys: [.isDirectoryKey],
options: [.skipsHiddenFiles]
)

var results: [URL] = []
while let url = enumerator?.nextObject() as? URL {
let values = try? url.resourceValues(forKeys: [.isDirectoryKey])
if values?.isDirectory == false, url.pathExtension == "md" {
results.append(url)
}
}

return results.sorted { $0.path < $1.path }
}
22 changes: 22 additions & 0 deletions Sources/Core/FileNode.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import Foundation

public indirect enum FileNode: Equatable, Identifiable {
case file(name: String, path: URL)
case directory(name: String, path: URL, children: [FileNode])

public var id: URL { path }

public var name: String {
switch self {
case .file(let name, _): return name
case .directory(let name, _, _): return name
}
}

public var path: URL {
switch self {
case .file(_, let path): return path
case .directory(_, let path, _): return path
}
}
}
Loading