summaryrefslogtreecommitdiff
path: root/internal/processor/processor.go
AgeCommit message (Collapse)Author
2026-04-27processor: refactor to two-phase commit for inbox processingPaul Buetow
Introduce postPlan to capture everything validated in Phase 1 before any filesystem mutation occurs. Phase 1 scans the inbox, validates all source files (parses text, markdown, image, audio), checks markdown image claims for conflicts, and collects a plan per item. Phase 2 commits mutations only after every plan is validated: creates post directories, writes assets, persists post.json, and removes sources. If Phase 1 fails (e.g. unsupported file, missing markdown image, claim conflict), no mutations occur and the inbox is left untouched. Roll back the partial post directory if a mutation fails during commit. Also refactor image and audio sub-processors into validation-only and write-only parts (validateImage/writeImageAsset, validateAudio/copyFile) so that Phase 1 is strictly read-only. All existing tests pass.
2026-04-27processor: reject two markdown files claiming the same inbox imagePaul Buetow
The pre-scan claimedByMarkdown used to mark an image as claimed by any markdown that referenced it, but it did not prevent two different markdown files from referencing the same image. When that happened, the first file processed would copy the image into its post directory and then delete it from the inbox. The second file then failed because the source image was already gone. Fix: make image claiming exclusive. claimedByMarkdown now tracks the owning markdown filename for each claimed image and returns an error immediately during the pre-scan if a conflict is detected. This way no sources are removed and no partial posts are created. Also add tests: - twoMarkdownsClaimingSameImageFails (negative) - duplicateImageClaimsInSameMarkdownAllowed (positive)
2026-04-27processor: fix uniqueID to return error instead of infinite loop on Stat errorsPaul Buetow
Previously, uniqueID(postsDir, t) returned only a string and looped forever when os.Stat returned an error other than IsNotExist (e.g. permission denied). Change the signature to (string, error), propagate the error, and update the caller in processFile to handle it. Add positive and negative tests covering new ID generation, suffix collision, and permission-based stat failure.
2026-04-16v0.2.0: markdown image embedding, post typography, modal improvementsv0.2.0Paul Buetow
Amp-Thread-ID: https://ampcode.com/threads/T-019d94cc-99a9-74af-8f3d-9521cd73324f Co-authored-by: Amp <amp@ampcode.com>
2026-04-10processor: document sequential Run and partial-batch semanticsPaul Buetow
Clarify in package comment and Run docstring that files are processed in order, successful sources are removed before later files run, and on error the returned count reflects posts already created. Made-with: Cursor
2026-04-10processor: document trusted inbox trust boundary for markdown HTMLPaul Buetow
Markdown uses goldmark html.WithUnsafe for intentional raw HTML in personal-inbox posts. Package and processMd comments state the trust model and warn against untrusted input on the same path. Made-with: Cursor
2026-04-10processor: return error when markdown pre-scan cannot read .mdPaul Buetow
claimedByMarkdown now wraps os.ReadFile failures instead of skipping, so Run fails fast and avoids wrong image claim state. Add regression test using an unreadable markdown file (Unix). Made-with: Cursor
2026-04-10processor: delete markdown inbox images only after Save succeedsPaul Buetow
buildMarkdownPost no longer removes referenced images during build. buildPost returns inboxExtras paths; processFile removes them after p.Save(postDir) succeeds, matching source file deletion ordering and avoiding loss of originals if Save fails. Made-with: Cursor
2026-04-09add snonux static microblog generatorPaul Buetow
Full Go implementation with: - txt/md/image/audio input processing, URL auto-linking in .txt files - Paginated HTML output with Atom feed - 11 visual themes: neon, terminal, synthwave, minimal, brutalist, paper, aurora, matrix, ocean, retro, glass (selectable via --theme flag) - Keyboard navigation (j/k/arrows, Enter modal, h/l page nav) - Shared nav templates (navhints, navmodal, navscript) across all themes - Magefile build automation; integration test suite covering all themes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>