Build the template chooser and Save as Template
The chooser completes its three tiers: bundled by template order, then keyed user templates, then keyless boards by display name — and a malformed user template still lists, by folder name with the loader's own sentence on the row, never failing its neighbours. The store is re-scanned on every presentation and on app activation, the Reveal round trip made honest without watching a folder 09 deliberately leaves unwatched; Reveal lives in the chooser's header and mints the store on first press. Save as Template repeats Duplicate's sequence — progress row with Cancel, flush, detached cancellable copy — through the engine: mint the store, read the next user order before the copy can count itself, Finder-ladder the name, copy excluding .git and .trash/, then stamp the whole template: mapping on the landed copy through updateIndex, with no bracket because the copy lives outside every watched board. Folder attributes deliberately don't carry — the one lock the command stays live under is the read-only-DMG one, and carrying its mode bits would mint a read-only template in the user's own store; the command gates instead on the real hazard, unsaved card content. A signpost names the template only when the ladder renamed it. One name ladder now serves Duplicate and the store. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -82,7 +82,12 @@ public enum BoardLoader: Sendable {
|
||||
/// Board-level key for `BoardModel.template` — not schema-owned in the engine's sense
|
||||
/// (`FrontmatterKeys.schemaOwned`), because its value is opaque and read raw here rather
|
||||
/// than through a typed `FrontmatterDocument` accessor.
|
||||
private static let templateKey = "template"
|
||||
///
|
||||
/// Internal rather than `private` for `indexFileName`'s reason: `TemplateEngine` writes this
|
||||
/// key on a Save as Template copy — "the one writer of keyed files is Save as Template"
|
||||
/// (09-templates.md ▸ Storage) — and the reader and that one writer must never disagree about
|
||||
/// how it is spelled.
|
||||
static let templateKey = "template"
|
||||
|
||||
/// Internal rather than `private`: `BoardWriter` names the same file, and the loader and
|
||||
/// the writer must never disagree about which file a folder's content lives in.
|
||||
|
||||
Reference in New Issue
Block a user