diff --git a/README.md b/README.md index 8c431ce..b285f46 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ Example output with `dirmd -o docs.md ~/repos/myproject --vertical-slices`: Output is designed for RAG ingestion and LLM context windows, not human presentation: +- **ISO 8601 Timestamp**: Added as a metadata line (`> Generated: ...`) immediately after the H1 header for every new file created. - **ASCII tree format** (`+-` instead of Unicode box-drawing) to reduce token overhead - **Explicit file delimiters**: `--- FILE: ./path (bytes, lines) ---` and `--- END FILE ---` - **Document type markers**: `[ROOT]` and `[SLICE]` in H1 headers @@ -218,15 +219,17 @@ For full documentation on the Proton Drive CLI, including installation, authenti Produces markdown with: 1. Absolute path as H1 header with `[ROOT]` or `[SLICE]` marker -2. ASCII directory tree (indented with `+-` and `|` characters) -3. Vertical slices index table (sliced mode only) -4. All text files with content in fenced code blocks -5. Explicit `--- FILE: ---` and `--- END FILE ---` delimiters with byte and line counts -6. Language detection from file extensions +2. **Timestamp metadata line** (ISO 8601) immediately after the H1 header (only for new files) +3. ASCII directory tree (indented with `+-` and `|` characters) +4. Vertical slices index table (sliced mode only) +5. All text files with content in fenced code blocks +6. Explicit `--- FILE: ---` and `--- END FILE ---` delimiters with byte and line counts +7. Language detection from file extensions Example output structure (non-sliced mode): # /home/user/repos/myproject [ROOT] + > Generated: 2026-09-02T14:30:00Z ## Directory Tree diff --git a/internal/renderer/renderer.go b/internal/renderer/renderer.go index 65daa27..c5c2cdb 100644 --- a/internal/renderer/renderer.go +++ b/internal/renderer/renderer.go @@ -6,6 +6,7 @@ import ( "path/filepath" "sort" "strings" + "time" "unicode/utf8" "git.flo.fo/FLO/dirmd/internal/tree" @@ -35,7 +36,12 @@ func Write(result *walker.Result, outputPath string, appendMode bool, singleFile h1Path = filepath.Join(result.AbsRoot, result.Entries[0].RelPath) } - fmt.Fprintf(&sb, "# %s [ROOT]\n\n", h1Path) + fmt.Fprintf(&sb, "# %s [ROOT]\n", h1Path) + + // Add timestamp only if creating a new file (not append mode) + if !appendMode { + fmt.Fprintf(&sb, "> Generated: %s\n\n", time.Now().Format(time.RFC3339)) + } if !singleFile { root := tree.Build(result.Entries) @@ -162,7 +168,9 @@ func writeRootSlice(path, absRoot, rootName, repoName string, rootFiles []walker var sb strings.Builder - fmt.Fprintf(&sb, "# %s [ROOT]\n\n", absRoot) + fmt.Fprintf(&sb, "# %s [ROOT]\n", absRoot) + // Timestamp for new file creation + fmt.Fprintf(&sb, "> Generated: %s\n\n", time.Now().Format(time.RFC3339)) treeLines := buildTreeWithRefs(rootName, repoName, topLevelDirs, rootFiles) sb.WriteString("## Directory Tree\n\n") @@ -239,7 +247,9 @@ func writeDirSlice(path, absDir, absRoot, dirName string, treeEntries, fileEntri var sb strings.Builder - fmt.Fprintf(&sb, "# %s [SLICE]\n\n", absDir) + fmt.Fprintf(&sb, "# %s [SLICE]\n", absDir) + // Timestamp for new file creation + fmt.Fprintf(&sb, "> Generated: %s\n\n", time.Now().Format(time.RFC3339)) fmt.Fprintf(&sb, "Root document: %s\n\n", rootFileName) sb.WriteString("## Directory Tree\n\n")