3.0 KiB
3.0 KiB
id, name, status, depends_on, scope, risk, impact, level
| id | name | status | depends_on | scope | risk | impact | level | ||
|---|---|---|---|---|---|---|---|---|---|
| frontmatter/file-io-and-serialize | Implement parseTaskFile, parseTaskDirectory, and serializeFrontmatter | completed |
|
moderate | low | component | implementation |
Description
Implement the file I/O frontmatter functions and the serializer. These are convenience wrappers for common use cases and the reverse operation (TaskInput → markdown).
Per frontmatter.md:
parseTaskFile/parseTaskDirectorydepend onnode:fs/promises(Node.js only)parseFrontmatteris runtime-agnosticserializeFrontmatterusesyaml.stringify()for the data portion
Acceptance Criteria
parseTaskFile(filePath: string): Promise<TaskInput>:- Reads file using
node:fs/promises.readFile - Delegates to
parseFrontmatterfor parsing and validation - Throws underlying Node.js error for I/O failures (ENOENT, EACCES, etc.)
- Reads file using
parseTaskDirectory(dirPath: string): Promise<TaskInput[]>:- Recursive directory scanning via
node:fs/promises.readdirwith{ withFileTypes: true }+ manual recursion - Filters for
.mdfiles only - Silently skips files without valid
----delimited frontmatter (no error thrown, just omitted from results) - Throws underlying Node.js error for I/O failures
- Uses
parseTaskFileper file
- Recursive directory scanning via
serializeFrontmatter(task: TaskInput, body?: string): string:- Constructs
----delimited markdown output - Uses
yaml.stringify()for theTaskInputdata (includes allTaskInputfields per schema) - Appends body content (default: empty string) after closing
--- - Handles nullable fields correctly:
risk: null→risk: nullin YAML (explicit null), absent fields → omitted from YAML
- Constructs
- File I/O functions documented as Node.js-only in JSDoc comments
- Unit tests: parseTaskFile with temp file, parseTaskDirectory with temp dir (including non-.md files, missing frontmatter files), serializeFrontmatter round-trip parseFrontmatter(serializeFrontmatter(task)) ≈ task
References
- docs/architecture/frontmatter.md — file I/O functions, splitter, serializer
- docs/architecture/schemas.md — TaskInput definition for serialization
Notes
All acceptance criteria verified by unit tests and TypeScript type-checker. File I/O functions moved to separate file-io.ts module to keep parse.ts runtime-agnostic. Stubs removed from parse.ts.
Summary
Implemented parseTaskFile, parseTaskDirectory, and serializeFrontmatter.
- Created:
src/frontmatter/file-io.ts(parseTaskFile, parseTaskDirectory — Node.js-only file I/O) - Modified:
src/frontmatter/serialize.ts(replaced stub with full serializeFrontmatter implementation) - Modified:
src/frontmatter/parse.ts(removed parseTaskFile/parseTaskDirectory stubs) - Modified:
src/frontmatter/index.ts(updated exports — file-io functions from file-io.js) - Created:
test/frontmatter-fileio-serialize.test.ts(29 tests) - Tests: 29 new + 257 existing = 286 total, all passing; tsc --noEmit clean