Commit graph

8 commits

Author SHA1 Message Date
kryptomrx
e9217ecb77 feat: mkdir command creates folders via _index.md
Uses a dedicated /api/cli/folders endpoint (separate from notes because
_index slugs contain underscores which the notes slug validator rejects).
Derives a readable title from the slug, navigates into the new folder
immediately even before any notes exist.
2026-05-17 00:28:01 +02:00
kryptomrx
5a26de8a11 feat: mv command with atomic note renaming and link rewriting
NoteRenamer fetches inbound graph edges, creates the note under the new
slug (patching the topic frontmatter field if the prefix changes),
rewrites all wikilinks and markdown links in linking notes, then deletes
the old slug. Tests cover wikilink/markdown-link replacement and topic
patching.
2026-05-17 00:27:53 +02:00
kryptomrx
0eebffe745 test: xUnit test suite and Forgejo CI pipeline
- 43 tests across SlugGuard, ReplContext navigation, NotesCache.TimeAgo
- SlugGuard moved to NozCli.Core.Security (shared between REPL and tests)
- Bug fix: FoldersInView() now returns only actual sub-folders, not note segments
  (previously cd tab-completion suggested note names as navigable folders)
- .forgejo/workflows/ci.yml: build + test on every push/PR
2026-05-16 23:53:40 +02:00
kryptomrx
b971d45e78 security: slug validation, path traversal protection, temp file cleanup
- SlugGuard.IsValid() rejects slugs with path traversal (../, //, uppercase)
- SlugGuard.ToSafePath() ensures sync writes stay within target directory
- PushCommand: skip files with invalid slugs before upload
- SyncCommand: validate server-returned slugs before writing to disk
- EditCommand/NewCommand: try/finally guarantees temp file deletion on crash
- NotesCache: set 600 permissions on cache file (metadata only, no token)
- NewCommand: remove dead Sha256 method (HashHelper already covers this)
2026-05-16 23:36:40 +02:00
kryptomrx
1865a7ccc2 feat(commands): clear, config, version
- clear: clears terminal screen
- config: view and set editor / code-editor preferences
- version: print version and git hash (noz 0.1.0 (abc1234))
2026-05-16 23:21:06 +02:00
kryptomrx
ae8a961cfd feat(commands): Dual-editor (nano/code), new note, parallel sync pull
- edit: terminal editor (nano/vim) by default, -c flag opens VS Code/Zed
- edit/new: ResolveTerminal() + ResolveCode() auto-detect editors on PATH
- new: create note from template, opens editor, confirms before push
- sync: pull notes from server with Parallel.ForEachAsync (8 concurrent)
- sync: hash diff - only download notes changed since last sync
- sync --dry-run: preview without writing, --all to force full download
- push: hash diff against server cache, Progress bar, --all flag
2026-05-16 23:20:59 +02:00
kryptomrx
cf54165735 feat(commands): ls with detailed view, tree hierarchy, CancellationToken support
- ls: compact view with status dots and folder markers
- ls -la: table view with status, lang, date, title; folders show mini status bar
- tree: recursive hierarchy using Spectre.Console Tree widget, context-aware
- All commands: CancellationToken threaded through ExecuteAsync
- Partition() helper respects topic-relative slug depth
2026-05-16 23:20:49 +02:00
kryptomrx
765ff7a976 Initial commit: noz-cli REPL skeleton 2026-05-16 19:25:39 +02:00