Add insert command

This commit is contained in:
Rogee
2025-10-30 15:15:16 +08:00
parent 6a353b5086
commit a0d7084c28
35 changed files with 2044 additions and 37 deletions

View File

@@ -0,0 +1,62 @@
# Data Model Insert Command
## Entity: InsertRequest
- **Fields**
- `WorkingDir string` — Absolute path derived from CLI `--path` or current directory.
- `PositionToken string` — Raw user input (`^`, `$`, positive int, negative int) describing insertion point.
- `InsertText string` — Unicode string to insert.
- `IncludeDirs bool` — Mirrors `--include-dirs` scope flag.
- `Recursive bool` — Mirrors `--recursive`.
- `IncludeHidden bool` — True only when `--hidden` supplied.
- `ExtensionFilter []string` — Normalized tokens from `--extensions`.
- `DryRun bool` — Preview-only execution state.
- `AutoConfirm bool` — Captures `--yes` for non-interactive runs.
- `Timestamp time.Time` — Invocation timestamp for ledger correlation.
- **Validation Rules**
- Reject empty `InsertText`, path separators, or control characters.
- Ensure `PositionToken` parses to a valid rune index relative to the stem (`^` = 0, `$` = len, positive 1-based, negative = offset from end).
- Confirm resulting filename is non-empty and does not change extension semantics.
- **Relationships**
- Consumed by insert engine to plan operations.
- Serialized into ledger metadata with `InsertSummary`.
## Entity: InsertSummary
- **Fields**
- `TotalCandidates int` — Items inspected after scope filtering.
- `TotalChanged int` — Entries that will change after insertion.
- `NoChange int` — Entries already containing target string at position (if applicable).
- `Conflicts []Conflict` — Target collisions or invalid positions.
- `Warnings []string` — Validation notices (duplicates, trimmed tokens, skipped hidden items).
- `Entries []PreviewEntry` — Ordered original/proposed mappings with status.
- `LedgerMetadata map[string]any` — Snapshot persisted with ledger entry (position, text, scope flags).
- **Validation Rules**
- Conflicts must be empty before apply.
- `TotalChanged + NoChange` equals count of entries with status `changed` or `no_change`.
- Entries sorted deterministically by original path.
- **Relationships**
- Emitted to preview renderer and ledger writer.
- Input for undo verification.
## Entity: Conflict
- **Fields**
- `OriginalPath string`
- `ProposedPath string`
- `Reason string` — (`duplicate_target`, `invalid_position`, `existing_file`, etc.)
- **Validation Rules**
- `ProposedPath` unique among planned operations.
- Reason restricted to known enum values for messaging.
- **Relationships**
- Reported in preview output and used to block apply.
## Entity: PreviewEntry
- **Fields**
- `OriginalPath string`
- `ProposedPath string`
- `Status string``changed`, `no_change`, `skipped`.
- `InsertedText string` — Text segment inserted (for auditing).
- **Validation Rules**
- `ProposedPath` equals `OriginalPath` when `Status == "no_change"`.
- `InsertedText` empty only for `no_change` or `skipped`.
- **Relationships**
- Displayed in preview output.
- Persisted with ledger metadata for undo playback.