esedre 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,54 @@ All notable changes to Esedre are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.2.0] - 2026-10-09
9
+
10
+ ### Added
11
+ - **MCP Ticket Listing Implementation Plan Hydration (`includePlan` and `hasPlan`) (Ticket #58)**:
12
+ - Extended `esedre_list_tickets` MCP tool to return `hasPlan: boolean` on all listed tickets, indicating whether an implementation plan exists on disk.
13
+ - Added optional `includePlan: boolean` parameter to `esedre_list_tickets` to hydrate full `planMarkdown` directly in ticket listings, eliminating redundant sequential `esedre_get_plan` tool calls when agents review multiple active tickets.
14
+ - Added unit test suite in `tests/mcpServer.test.ts` verifying `hasPlan` and `includePlan` behavior across multiple tickets.
15
+ - **Comment File Input Option for CLI & MCP Tool (Ticket #62)**:
16
+ - Added `--file <path>` option to `ese comment` CLI command, reading verification notes directly from UTF-8 markdown or text files on disk.
17
+ - Bypasses Windows `cmd.exe` `%VAR%` parameter expansion and stripping, preserving percent signs (`100%`) and literal characters verbatim.
18
+ - Added priority precedence for `--file` over inline `--text` and positional arguments, with existence, regular file, and non-empty content validation.
19
+ - Added parity `file?: string` property to `esedre_add_comment` MCP tool, with automatic local file resolution and relaxed `required: ['ticketId']` schema constraint.
20
+ - Added comprehensive automated test suite in `tests/cliComment.test.ts` covering error handling, priority precedence, percent preservation, and MCP execution.
21
+
22
+ ## [1.1.0] - 2026-10-02
23
+
24
+ ### Added
25
+ - **Completed Full Set of Edit Capabilities in the UI & Interactive Planning Engine**:
26
+ - **Open Decisions & Questions Answering**: Completed planned UI editing and persistence for developer answers to Open Decisions and Questions directly into ticket storage (`answers.json`), with real-time hydration across `/api/planning/answers` and `/api/planning/all`.
27
+ - **Live Specification Detail Editing**: Completed planned real-time editing of ticket Markdown specifications in the UI via `POST /api/planning/details`, with direct sync to `detail.md` on disk, automatic timestamp tracking, and revision bumping.
28
+ - **Interactive Inline Text Annotations**: Completed planned text selection commentary in the UI via `POST /api/planning/save-inline-comment` and `GET /api/planning/inline-comments`, persisting highlighted annotations to `inline-comments.json`.
29
+ - **Discussion Media Attachments Pipeline**: Completed planned drag-and-drop and clipboard paste media attachment uploading and streaming via `POST /api/planning/upload-attachment` and `GET /api/planning/attachment`, with path traversal protections, deduplication guards, and automatic MIME detection.
30
+ - **Local Draft Recovery**: Added automatic browser draft caching in `localStorage` (`dev_planner_question_drafts`) for developer question replies, ensuring in-progress answers are never lost during accidental reloads or tab navigation.
31
+ - **CLI Answer Visibility**: Enhanced `ese get` output to automatically display recorded answers beneath their corresponding Open Decisions & Questions.
32
+ - **Smart Data Hub Inheritance**: Enabled workspace configuration (`.esedre/esedre.json`) to omit `dataDir` and seamlessly inherit from user-level global configuration (`~/.esedre/config.json`) when the hub contains the project.
33
+ - **Multi-Workspace Batch Upgrade Automation (`ese upgrade --all`)**: Extended `ese upgrade` with `--all` (`-a`) to automatically scan all registered workspace projects declared in `~/.esedre/config.json`, upgrade shell wrappers (`.esedre/esedre.cmd`, `.esedre/ese.cmd`, `.esedre/esedre.ps1`, `.esedre/ese.ps1`), synchronize agent skills, and regenerate `.esedre/snapshot.json` projections.
34
+ - **Wrapper Health Diagnostics**: Added `isWrapperOutdated` and `findOutdatedWrappers` in `src/upgrade.ts` to detect legacy CMD wrappers containing parenthesized compound blocks or `goto :done`. Exposed non-blocking diagnostic notices in `ese status` and `ese status --json`.
35
+ - **Ticket Card Pill Layout Standardization**: Reorganized ticket card header metadata into two distinct rows: fixed-width pills in Row 1 (Type, Complexity, Priority, Blocked indicator, Status) and flexible-width badges in Row 2 (Project badge in All Projects view, Feature Flag, Milestone).
36
+ - **Ticket Specification Detail Updates via CLI & MCP (Ticket #49)**: Added `--detail "<md>"` and `--file <path>` options to `ese update`, and `detail` / `detailMarkdown` parameters to `esedre_update_ticket` MCP tool. Specification updates reconcile metadata headers, preserve OCC validation, and automatically invalidate caches.
37
+ - **In-Memory Query Caching & Zero-Flash UI Fast-Path (Ticket #47)**: Added in-memory caching to `FilesystemStorageAdapter` with automatic mutation invalidation and background hydration, eliminating empty state flashing and load lag.
38
+ - **Standardized Git Branching & Clean Commit Format**: Codified `release/upcoming` staging trunk integration workflow and `[#<ticket>] <Action Summary>` clean commit message standards, prohibiting conventional commit prefixes across repositories.
39
+
40
+ ### Fixed
41
+ - **Windows CMD Batch Label Error in Consuming Workspaces**: Hardened `WRAPPER_CMD` subroutine dispatch and eliminated legacy parenthesized `goto :done` blocks in downstream consuming repositories that caused `cmd.exe` to fail with `'The system cannot find the batch label specified - done'` (Ticket #43).
42
+ - **Dual-Stack Loopback Binding**: Configured Vite development server (`vite.config.ts`) with `host: '0.0.0.0'`, ensuring consuming development reverse proxies can proxy planning endpoints to `http://127.0.0.1:5674` without `502 Bad Gateway` / `ECONNREFUSED` connection drops on Windows IPv4/IPv6 dual-stack setups.
43
+ - **Deep-Linking & History Push for Multi-Part Projects**: Enhanced hash parsing and resolution (`parseTicketHash`, `resolveFeatureFromHash`, `getFeatureHash`) to robustly support hyphens and multi-word project names (e.g. `#ticket-alce-web-1`), deep link directly to tickets on page load with automatic project filter switching and scrolling, while preserving history push in standalone mode and preventing history interference in embedded mode.
44
+ - **Root URL Hash Push Bug**: Fixed bug where navigating to the root standalone UI URL (`http://localhost:5674/`) automatically forced and pushed `#ticket-1` to the browser address bar. The UI now preserves clean root URLs without pushing ticket hashes unless a ticket is explicitly clicked or deep-linked.
45
+ - **Header Popover Viewport Containment**: Constrained card header dropdown popovers (Type, Priority, Status, Complexity, Feature Flag, Milestone) to fit within viewport height with smooth vertical scrolling and sticky subheadings, preventing offscreen vertical clipping.
46
+ - **Project Filter Dropdown & Hash Decoupling**: Fixed bug where ticket display names were assigned to feature project properties, causing corrupted URL search parameters and locking the project filter dropdown. Decoupled project selection from the hash listener effect and normalized filter lookups.
47
+ - **Test Suite Data Hub Isolation Guard**: Hardened `getGlobalConfigDir()` in `src/config.ts` to automatically redirect to a temporary sandbox directory when running under Vitest (`process.env.VITEST`), preventing unit test runs from reading or mutating developer machines' active `~/.esedre/config.json` and real data hubs.
48
+
49
+ ### Security & Hardening
50
+ - **REST Endpoint Parameter Validation & Cache Invalidation**:
51
+ - Added strict parameter checks on mutating planning endpoints (`ticketId` required on plans, comments, details, meta updates, and flags).
52
+ - Wired real-time API cache invalidation across all mutating endpoints to ensure `/api/planning/all` never returns stale projections.
53
+ - Hardened attachment endpoints against path traversal attacks (`..`, `.`, subpaths) and directory reads, verifying regular file integrity.
54
+ - Enforced Agent Project Allow-List authorization across all attachment lookups and new storage endpoints.
55
+
8
56
  ## [1.0.1] - 2026-09-28
9
57
 
10
58
  ### Added
package/README.md CHANGED
@@ -118,11 +118,11 @@ Core day-to-day workflow commands for scoping, viewing, planning, and verifying
118
118
  | `get` | `ese get <id> [--json]` | View ticket specifications, feature breakdown, comments, links, and SHA-1 hash. |
119
119
  | `plan` | `ese plan <id> [--set "<markdown>"] [--file <path>] [--last-hash <h>]` | Read or update the active implementation plan markdown. |
120
120
  | `create` | `ese create --title "..." [-p\|--project <code>] [-t\|--type <type>] [-P\|--priority <priority>] [-m\|--milestone <name>] [--detail "<md>"] [--file <path>]` | Create a new ticket with auto-sequential ID, optional priority, optional milestone, and specification markdown. Title strictly capped at 48 chars. |
121
- | `update` | `ese update <id> [-s\|--status <status>] [-t\|--type <type>] [-P\|--priority <priority\|none>] [-m\|--milestone <name\|none>] [--title "..."] [--last-hash <h>]` | Update ticket status, type, priority, milestone, or title with optimistic concurrency protection. |
121
+ | `update` | `ese update <id> [-s\|--status <status>] [-t\|--type <type>] [-P\|--priority <priority\|none>] [-m\|--milestone <name\|none>] [--title "..."] [--detail "<md>"] [--file <path>] [--last-hash <h>]` | Update ticket status, type, priority, milestone, title, or specification markdown with optimistic concurrency protection. |
122
122
  | `link` | `ese link <sourceId> <relation> <targetId> [--author "..."]` | Establish a bi-directional link between two tickets. Relations: `relates-to`, `blocks`, `parent-of`, `duplicates`. |
123
123
  | `unlink` | `ese unlink <sourceId> <targetId> [--relation <relation>]` | Remove a bi-directional link between two tickets. |
124
124
  | `milestone` | `ese milestone [list\|get\|create\|update\|delete] [args...]` | Manage project milestones and umbrella feature flags with deliverables tracking. |
125
- | `comment` | `ese comment <id> ["<text>"] [--text "..."] [--author "..."]` | Append a developer or LLM agent note to ticket history. |
125
+ | `comment` | `ese comment <id> ["<text>"] [--file <path>] [--text "..."] [--author "..."]` | Append a developer or LLM agent note to ticket history. |
126
126
  | `snapshot`, `refresh` | `ese snapshot [--project <code>] [--json]` | Generate or refresh projection `.esedre/snapshot.json` for zero-latency agent context. |
127
127
  | `projects` | `ese projects [--json]` | List registered projects within authorized scope. |
128
128
 
@@ -148,7 +148,7 @@ Commands for repository onboarding, central machine linking, and maintenance:
148
148
  | `configure` | `ese configure [add <path> \| remove <code\|path> \| set <k> <v>]` | Inspect or mutate central configuration (`~/.esedre/config.json`). Link external project repositories or data hubs. |
149
149
  | `rename-project` | `ese rename-project <oldCode> <newCode> [--name "<name>"]` | Rename a project code across directory storage paths, manifests, and tickets. |
150
150
  | `project set` | `ese project set <code> [--name "<name>"]` | Update metadata for an existing project (e.g. display name). |
151
- | `upgrade` | `ese upgrade [<path>] [--force \| -f]` | Upgrade workspace configuration schema, in-repo wrappers, and agent skills. |
151
+ | `upgrade` | `ese upgrade [<path>] [--all \| -a] [--force \| -f]` | Upgrade workspace configuration schema, in-repo wrappers, and agent skills across current or all registered workspaces. |
152
152
 
153
153
  > **Human vs LLM Agent Workflows**: Developer Administration commands (`init`, `configure`, `upgrade`) manage system-level repository linking and central machine configuration. They are intended for human developers during initial setup. Autonomous LLM coding partners operate within the authorized workspace scope using Roadmap and Service Daemon commands (`list`, `get`, `plan`, `create`, `update`, `comment`, `snapshot`, `start`, `status`).
154
154
 
@@ -158,6 +158,15 @@ Esedre cleanly separates external repository linking from centralized data hub p
158
158
  * **Link Existing Repositories (`ese configure add <repoPath>`)**: Registers an external code repository in your central `projects` map (`~/.esedre/config.json`) for federated multi-repo workflows.
159
159
  * **Create Data Hub Projects (`ese init --project <code> [--name "<name>"] [--hub <hub>]`)**: Registers a non-development or standalone project directly inside your configured ticket data hub (`dataDir`). When multiple data hubs exist, pass `--hub <name|path>` to disambiguate.
160
160
 
161
+ #### Central Configuration & Hoisted Data Directories
162
+
163
+ Esedre employs a two-tier configuration model that cleanly isolates machine-specific paths from project repositories:
164
+ * **Central Machine Configuration (`~/.esedre/config.json`)**: Configured via `ese configure`, this file holds user-level settings for your machine: registered ticket data hubs (`dataDir`, such as `../esedre-data`), linked external repository paths (`projects`), and the default server port.
165
+ * **Workspace Repository Configuration (`.esedre/esedre.json`)**: Project code repositories only need a lightweight descriptor declaring their `projectCode` and authorized `allowedProjects` scope.
166
+ * **Smart Data Hub Inheritance**: When `dataDir` is omitted from `.esedre/esedre.json`, Esedre automatically checks if your central data hub in `~/.esedre/config.json` contains the project. If found, it inherits the hub path seamlessly. Different developers collaborating on the same codebase can maintain their ticket hubs in different filesystem locations without committing machine-specific relative paths to version control.
167
+ * **Subdirectory Guard in `ese init`**: Initializing a repository via `ese init` does not write `dataDir` to `.esedre/esedre.json` when the configured data hub is located outside the repository. A `dataDir` property is only written to `.esedre/esedre.json` if `dataDir` is a subdirectory within the project's repository (such as a monorepo subfolder or in-repo ticket directory), or if explicitly specified via `--data-dir`.
168
+ * **Local In-Repo Overrides**: If a repository explicitly specifies `dataDir` in its `.esedre/esedre.json`, the local configuration takes full precedence, ensuring standalone in-repo ticket stores remain completely independent.
169
+
161
170
  #### Unique Project Codes Across Data Hubs
162
171
 
163
172
  Project codes must be unique across all configured data hubs. Esedre does not support duplicate project codes across data hubs. If duplicate project codes are detected across multiple hubs:
@@ -190,7 +199,7 @@ To connect Esedre to **Google Antigravity**, **Claude Code**, **Cursor**, or any
190
199
  ```
191
200
 
192
201
  ### Registered Tools
193
- - `esedre_list_tickets`: List tickets with optional project, status, type, priority, milestone, isBlocked, linkedTo, or search filter.
202
+ - `esedre_list_tickets`: List tickets with optional project, status, type, priority, milestone, isBlocked, linkedTo, search, or includePlan filter.
194
203
  - `esedre_get_ticket`: Retrieve full specification, summary, comments, revision, links, blocker status, and content hash (`sha1`).
195
204
  - `esedre_get_plan` & `esedre_save_plan`: Inspect and update implementation plans with optimistic concurrency (`lastHash`).
196
205
  - `esedre_create_ticket`: Mint new roadmap tickets with project code validation (up to 8 chars), optional priority, optional milestone, and specification detail markdown.
@@ -201,7 +210,7 @@ To connect Esedre to **Google Antigravity**, **Claude Code**, **Cursor**, or any
201
210
  - `esedre_get_milestone`: Retrieve milestone specifications, umbrella feature flag, and member tickets.
202
211
  - `esedre_create_milestone`: Create a project milestone with optional umbrella feature flag and target date.
203
212
  - `esedre_update_milestone`: Update milestone status, title, description, or umbrella feature flag.
204
- - `esedre_add_comment`: Append developer or LLM agent verification notes.
213
+ - `esedre_add_comment`: Append developer or LLM agent verification notes with optional file path or inline text.
205
214
 
206
215
  ### Cross-Project Linked Issues & Dependencies
207
216