esedre 0.1.8 → 0.1.9

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/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [![License: MPL 2.0](https://img.shields.io/badge/License-MPL_2.0-blue.svg)](LICENSE)
10
10
  [![Tests](https://img.shields.io/badge/Tests-100%25%20Passing-emerald.svg)](tests/)
11
- [![Website: www.arwam.com](https://img.shields.io/badge/Website-www.arwam.com-cyan.svg)](https://www.arwam.com)
11
+ [![Website: arwam.com](https://img.shields.io/badge/Website-arwam.com-cyan.svg)](https://arwam.com)
12
12
 
13
13
  ---
14
14
 
@@ -115,10 +115,10 @@ Core day-to-day workflow commands for scoping, viewing, planning, and verifying
115
115
  | `list` | `ese list [-p\|--project <code\|all>] [-s\|--status <status>] [-t\|--type <type>] [--json]` | List roadmap tickets with optional filters. Defaults to the active project. |
116
116
  | `get` | `ese get <id> [--json]` | View ticket specifications, feature breakdown, comments, and SHA-1 hash. |
117
117
  | `plan` | `ese plan <id> [--set "<markdown>"] [--file <path>] [--last-hash <h>]` | Read or update the active implementation plan markdown. |
118
- | `create` | `ese create --title "..." [-p\|--project <code>] [-t\|--type <type>]` | Create a new ticket with auto-sequential ID. Title strictly capped at 48 chars. |
118
+ | `create` | `ese create --title "..." [-p\|--project <code>] [-t\|--type <type>] [--detail "<md>"] [--file <path>]` | Create a new ticket with auto-sequential ID and optional specification markdown. Title strictly capped at 48 chars. |
119
119
  | `update` | `ese update <id> [-s\|--status <status>] [-t\|--type <type>] [--title "..."] [--last-hash <h>]` | Update ticket status, type, or title with optimistic concurrency protection. |
120
120
  | `comment` | `ese comment <id> ["<text>"] [--text "..."] [--author "..."]` | Append a developer or LLM agent note to ticket history. |
121
- | `snapshot` | `ese snapshot [--project <code>] [--json]` | Generate lean projection `.esedre/snapshot.json` for zero-latency agent context. |
121
+ | `snapshot`, `refresh` | `ese snapshot [--project <code>] [--json]` | Generate or refresh projection `.esedre/snapshot.json` for zero-latency agent context. |
122
122
  | `projects` | `ese projects [--json]` | List registered projects within authorized scope. |
123
123
 
124
124
  ### Service Daemon Commands
@@ -186,7 +186,7 @@ To connect Esedre to **Google Antigravity**, **Claude Code**, **Cursor**, or any
186
186
  - `esedre_list_tickets`: List tickets with optional project, status, category, or search filter.
187
187
  - `esedre_get_ticket`: Retrieve full specification, summary, comments, revision, and content hash (`sha1`).
188
188
  - `esedre_get_plan` & `esedre_save_plan`: Inspect and update implementation plans with optimistic concurrency (`lastHash`).
189
- - `esedre_create_ticket`: Mint new roadmap tickets with project code validation (up to 8 chars).
189
+ - `esedre_create_ticket`: Mint new roadmap tickets with project code validation (up to 8 chars) and optional specification detail markdown.
190
190
  - `esedre_update_ticket`: Modify status, title, complexity, or effort with optimistic concurrency (`lastHash`).
191
191
  - `esedre_add_comment`: Append developer or LLM agent verification notes.
192
192
 
@@ -283,4 +283,4 @@ npm run build
283
283
 
284
284
  ## 📄 License
285
285
 
286
- [Mozilla Public License 2.0 (MPL-2.0)](LICENSE) © [ARWAM](https://www.arwam.com)
286
+ [Mozilla Public License 2.0 (MPL-2.0)](LICENSE) © [ARWAM](https://arwam.com)
package/dist/esedre.mjs CHANGED
@@ -9,7 +9,7 @@ import fs3 from "node:fs";
9
9
  import path3 from "node:path";
10
10
 
11
11
  // src/types.ts
12
- var CURRENT_ESEDRE_VERSION = "0.1.8";
12
+ var CURRENT_ESEDRE_VERSION = "0.1.9";
13
13
  var EsedreConflictError = class extends Error {
14
14
  constructor(ticketId, currentHash, lastHash) {
15
15
  super(
@@ -1428,7 +1428,62 @@ ${formattedList}`
1428
1428
  projectId: targetLoc.project.id,
1429
1429
  project: targetLoc.project.code
1430
1430
  };
1431
- const detailMd = `# Ticket #${nextId}: ${meta.title}
1431
+ const rawDetail = (input.detailMarkdown || input.detail)?.trim();
1432
+ let detailMd;
1433
+ if (rawDetail) {
1434
+ if (/^#\s+[^\n]+/m.test(rawDetail)) {
1435
+ let processed = rawDetail.replace(/^#\s+[^\n]+/m, `# Ticket #${nextId}: ${meta.title}`);
1436
+ if (!/\*\*(?:Type|Category)\*\*:/i.test(processed)) {
1437
+ const metaBlock = `
1438
+ **Category**: ${meta.category}
1439
+ **Complexity**: ${meta.complexity}
1440
+ **Estimated Effort**: ${meta.estimatedEffort}
1441
+ `;
1442
+ processed = processed.replace(/^(# Ticket[^\n]+\n)/m, `$1${metaBlock}`);
1443
+ }
1444
+ if (!/(?:##|###)\s*(?:Summary|Rationale)/i.test(processed)) {
1445
+ const summaryBlock = `
1446
+ ### Summary
1447
+ ${input.summary || "Summary to be defined."}
1448
+ `;
1449
+ processed = processed.replace(/^((?:# Ticket[^\n]+\n)(?:\*\*[^\n]+\n)*)/m, `$1${summaryBlock}`);
1450
+ }
1451
+ detailMd = processed.endsWith("\n") ? processed : `${processed}
1452
+ `;
1453
+ } else {
1454
+ const hasSummary = /(?:##|###)\s*(?:Summary|Rationale)/i.test(rawDetail);
1455
+ const hasBreakdown = /(?:##|###)\s*Feature Breakdown/i.test(rawDetail);
1456
+ let body = "";
1457
+ if (!hasSummary) {
1458
+ body += `### Summary
1459
+ ${input.summary || "Summary to be defined."}
1460
+
1461
+ `;
1462
+ }
1463
+ if (!hasBreakdown && !rawDetail.startsWith("#")) {
1464
+ body += `### Feature Breakdown
1465
+ ${rawDetail}
1466
+
1467
+ ### Technical Details & Architecture
1468
+ - Architecture specifications to be documented.
1469
+
1470
+ ### Open Questions & Decisions
1471
+ - None recorded at initialization.
1472
+ `;
1473
+ } else {
1474
+ body += `${rawDetail}
1475
+ `;
1476
+ }
1477
+ detailMd = `# Ticket #${nextId}: ${meta.title}
1478
+ **Category**: ${meta.category}
1479
+ **Complexity**: ${meta.complexity}
1480
+ **Estimated Effort**: ${meta.estimatedEffort}
1481
+
1482
+ ${body.trim()}
1483
+ `;
1484
+ }
1485
+ } else {
1486
+ detailMd = `# Ticket #${nextId}: ${meta.title}
1432
1487
  **Category**: ${meta.category}
1433
1488
  **Complexity**: ${meta.complexity}
1434
1489
  **Estimated Effort**: ${meta.estimatedEffort}
@@ -1446,6 +1501,7 @@ ${input.summary || "Summary to be defined."}
1446
1501
  ### Open Questions & Decisions
1447
1502
  - None recorded at initialization.
1448
1503
  `;
1504
+ }
1449
1505
  writeSafeFile(path3.join(ticketDir, "meta.json"), JSON.stringify(meta, null, 2) + "\n");
1450
1506
  writeSafeFile(path3.join(ticketDir, "detail.md"), detailMd);
1451
1507
  const created = await this.getTicket(`${targetLoc.project.code}-${nextId}`);
@@ -2066,6 +2122,7 @@ Status: ${ticket.meta.status}`;
2066
2122
  complexity: { type: "string", description: "Complexity (e.g. Low, Medium, High)" },
2067
2123
  effort: { type: "string", description: "Estimated effort (e.g. 2.0 - 4.0 hours)" },
2068
2124
  summary: { type: "string", description: "Initial feature summary" },
2125
+ detail: { type: "string", description: "Initial specification, feature breakdown, or technical detail markdown" },
2069
2126
  author: { type: "string", description: "Submitting author name" }
2070
2127
  },
2071
2128
  required: ["title"]
@@ -2156,6 +2213,8 @@ Status: ${ticket.meta.status}`;
2156
2213
  complexity: args.complexity,
2157
2214
  estimatedEffort: args.effort,
2158
2215
  summary: args.summary,
2216
+ detail: args.detail || args.detailMarkdown,
2217
+ detailMarkdown: args.detailMarkdown || args.detail,
2159
2218
  submittedBy: args.author || "Agent"
2160
2219
  });
2161
2220
  return created;
@@ -2804,6 +2863,14 @@ exit /b %ERRORLEVEL%
2804
2863
  `;
2805
2864
  var WRAPPER_PS1 = `# Esedre Autonomous Ticketing & Project Planning Engine Wrapper (PowerShell)
2806
2865
  $ErrorActionPreference = "Stop"
2866
+
2867
+ # Ensure UTF-8 console output and pipeline encoding on Windows
2868
+ try {
2869
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
2870
+ [Console]::InputEncoding = [System.Text.Encoding]::UTF8
2871
+ $OutputEncoding = [System.Text.Encoding]::UTF8
2872
+ } catch {}
2873
+
2807
2874
  $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
2808
2875
 
2809
2876
  if (Get-Command "ese" -ErrorAction SilentlyContinue) {
@@ -2867,6 +2934,12 @@ REM Ese CLI short alias wrapper for Esedre (Windows CMD)
2867
2934
  call "%~dp0esedre.cmd" %*
2868
2935
  `;
2869
2936
  var ESE_WRAPPER_PS1 = `# Ese CLI short alias wrapper for Esedre (PowerShell)
2937
+ try {
2938
+ [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
2939
+ [Console]::InputEncoding = [System.Text.Encoding]::UTF8
2940
+ $OutputEncoding = [System.Text.Encoding]::UTF8
2941
+ } catch {}
2942
+
2870
2943
  $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
2871
2944
  & (Join-Path $scriptDir "esedre.ps1") @args
2872
2945
  exit $LASTEXITCODE
@@ -2878,7 +2951,9 @@ exec "$DIR/esedre" "$@"
2878
2951
  `;
2879
2952
  var HISTORIC_SKILL_HASHES = [
2880
2953
  "8611116c276fdfb598b965c716b251ce7c77c7f7",
2881
- "05f129fb6e06a18df00215af105567abcbf0bc67"
2954
+ "05f129fb6e06a18df00215af105567abcbf0bc67",
2955
+ "5d330ecf8fc96f383946e0351adb60378afa70f0",
2956
+ "23716c9db561e52e5115dc364fe154d3a7bc1e23"
2882
2957
  ];
2883
2958
  var ESEDRE_SKILL_TEMPLATE = `---
2884
2959
  name: esedre
@@ -2889,9 +2964,18 @@ description: Tooling and workflow reference for interacting with the Esedre deve
2889
2964
 
2890
2965
  Esedre is the developer ticketing and LLM coding partner coordination platform. The engine codebase resides in the standalone repository \`aellinsar/esedre\` (\`../esedre\`), and operates on decoupled ticket repositories (such as \`aellinsar/esedre-data\` configured in \`.esedre/esedre.json\`). Interact with tickets via in-repo shell wrappers in \`.esedre/\` (\`.esedre/ese\`), or the global \`ese\` CLI.
2891
2966
 
2892
- ## 0. Instant Zero-Latency Context (\`.esedre/snapshot.json\`)
2967
+ ## 0. Authoritative Ingress Hierarchy & Zero-Latency Context (\`.esedre/snapshot.json\`)
2893
2968
 
2894
- Before querying tickets over the network or CLI, check \`.esedre/snapshot.json\` in the workspace root. It provides a local read-only projection containing all active and completed tickets, summaries, implementation plans, revision numbers, completion dates (\`completedAt\`), and staleness metrics (\`daysSinceUpdate\`).
2969
+ All ticket discovery, inspection, and state management strictly follow this positive ingress hierarchy:
2970
+
2971
+ 1. **Step 1 (Default for Read-Only Inspection) - Local Snapshot Projection**:
2972
+ Always read \`.esedre/snapshot.json\` in the workspace root first. It provides an immediate, zero-latency local projection containing all active and completed tickets, summaries, implementation plans, revision numbers, completion dates (\`completedAt\`), and staleness metrics (\`daysSinceUpdate\`).
2973
+ 2. **Step 2 (Dynamic Queries & State Mutations) - Esedre MCP Tools**:
2974
+ Use first-class MCP tools when active in the session (\`esedre_list_tickets\`, \`esedre_get_ticket\`, \`esedre_get_plan\`, \`esedre_save_plan\`, \`esedre_update_ticket\`, \`esedre_add_comment\`).
2975
+ 3. **Step 3 (Terminal & Script Fallback) - In-Repo CLI Wrapper**:
2976
+ Use \`.esedre/ese\` (\`.esedre/ese get\`, \`.esedre/ese plan\`, \`.esedre/ese update\`, \`.esedre/ese snapshot\`, \`.esedre/ese refresh\`).
2977
+ 4. **Storage Boundary**:
2978
+ Backing ticket hubs (such as \`esedre-data\`) represent data storage managed by the engine. All agent interactions with roadmap tickets flow through the snapshot projection, MCP tools, or CLI wrappers.
2895
2979
 
2896
2980
  ## 1. Model Context Protocol (MCP) Tools
2897
2981
 
@@ -2903,7 +2987,7 @@ When Esedre MCP is active in your agent session (\`.agents/mcp_config.json\`), u
2903
2987
  | \`esedre_get_ticket\` | Full specification, summary, comments, revision & sha1 | \`ticketId\` (numeric e.g. \`96\` or compound e.g. \`Profe-96\`) |
2904
2988
  | \`esedre_get_plan\` | Active implementation plan markdown | \`ticketId\` (numeric or compound) |
2905
2989
  | \`esedre_save_plan\` | Save implementation plan markdown with OCC | \`ticketId\`, \`planMarkdown\`, \`lastHash\` |
2906
- | \`esedre_create_ticket\` | Mint a new ticket with auto sequential ID | \`title\` (max 48 chars), \`type\`, \`project\`, \`effort\`, \`summary\` |
2990
+ | \`esedre_create_ticket\` | Mint a new ticket with auto sequential ID | \`title\` (max 48 chars), \`type\`, \`project\`, \`effort\`, \`summary\`, \`detail\` |
2907
2991
  | \`esedre_update_ticket\` | Update ticket attributes with OCC | \`ticketId\`, \`status\`, \`type\`, \`title\`, \`complexity\`, \`effort\`, \`inDevelopment\`, \`featureFlag\`, \`lastHash\` |
2908
2992
  | \`esedre_add_comment\` | Append developer or agent comment | \`ticketId\`, \`text\`, \`author\` |
2909
2993
 
@@ -2930,7 +3014,7 @@ Both \`esedre\` and \`ese\` work interchangeably:
2930
3014
 
2931
3015
  ### Create a Ticket
2932
3016
  \`\`\`bash
2933
- .esedre/ese create --title "..." [-p|--project <code>] [-t|--type Feature] [--complexity Medium] [--effort "2.0 - 4.0 hours"] [--json]
3017
+ .esedre/ese create --title "..." [-p|--project <code>] [-t|--type Feature] [--complexity Medium] [--effort "2.0 - 4.0 hours"] [--detail "<md>"] [--file <path>] [--json]
2934
3018
  \`\`\`
2935
3019
 
2936
3020
  ### Update Ticket Status & Attributes
@@ -2949,6 +3033,7 @@ Both \`esedre\` and \`ese\` work interchangeably:
2949
3033
  ### Regenerate Snapshot
2950
3034
  \`\`\`bash
2951
3035
  .esedre/ese snapshot
3036
+ .esedre/ese refresh
2952
3037
  \`\`\`
2953
3038
 
2954
3039
  ### Server Lifecycle & Daemon Management
@@ -3300,6 +3385,18 @@ function configureWorkspace(targetDir, options = {}) {
3300
3385
  };
3301
3386
  }
3302
3387
  var initWorkspace = configureWorkspace;
3388
+ var ESEDRE_HUB_AGENTS_TEMPLATE = `# Agent Guidelines: esedre-data
3389
+
3390
+ ## 1. Role & Storage Boundary
3391
+ - **Backing Storage Repository**: \`esedre-data\` is a dedicated, decoupled data hub storing raw tickets, metadata manifests, and implementation plans managed by the Esedre engine.
3392
+ - **Authorized Ingress Channels**: Ticket discovery, read-only inspection, status updates, and plan authoring strictly ingress through the Esedre application layer in consuming project workspaces:
3393
+ 1. **Local Workspace Snapshot**: Check the consuming workspace's \`.esedre/snapshot.json\` first for instant, zero-latency read access to ticket summaries, plans, and statuses.
3394
+ 2. **Esedre MCP Tools**: Use \`esedre_get_ticket\`, \`esedre_list_tickets\`, \`esedre_get_plan\`, \`esedre_save_plan\`, and \`esedre_update_ticket\`.
3395
+ 3. **Esedre CLI**: Execute \`.esedre/ese get <id>\`, \`.esedre/ese list\`, or \`.esedre/ese plan\` from within the relevant project workspace.
3396
+
3397
+ ## 2. Ingress Redirection Protocol
3398
+ When inspecting or managing tickets for any project (such as \`Profe\`, \`Esedre\`, or \`Alce\`), navigate to that project's workspace and utilize its local \`.esedre/snapshot.json\`, Esedre MCP tools, or \`.esedre/ese\` CLI wrapper.
3399
+ `;
3303
3400
  function initHub(targetDir) {
3304
3401
  const resolved = path6.resolve(targetDir);
3305
3402
  if (!fs6.existsSync(resolved)) {
@@ -3317,9 +3414,16 @@ function initHub(targetDir) {
3317
3414
  fs6.writeFileSync(projectsJsonPath, "[]\n", "utf-8");
3318
3415
  projectsJsonCreated = true;
3319
3416
  }
3417
+ const agentsMdPath = path6.join(resolved, "AGENTS.md");
3418
+ let agentsMdCreated = false;
3419
+ if (!fs6.existsSync(agentsMdPath)) {
3420
+ fs6.writeFileSync(agentsMdPath, ESEDRE_HUB_AGENTS_TEMPLATE, "utf-8");
3421
+ agentsMdCreated = true;
3422
+ }
3320
3423
  return {
3321
3424
  projectsJsonCreated,
3322
3425
  projectsDirCreated,
3426
+ agentsMdCreated,
3323
3427
  hubDir: resolved.replace(/\\/g, "/")
3324
3428
  };
3325
3429
  }
@@ -3885,7 +3989,7 @@ ${colors.bold}ROADMAP COMMANDS (Pair Programming & LLM Agents):${colors.reset}
3885
3989
  ${colors.bold}plan${colors.reset} <id> [--file <path> | --set "<markdown>"] [--last-hash <sha1>] [--json]
3886
3990
  View or update implementation plan with optimistic concurrency control.
3887
3991
 
3888
- ${colors.bold}create${colors.reset} --title "..." [-p|--project <code>] [-t|--type <type>] [--complexity <c>] [--effort "<e>"] [--summary "<s>"] [--json]
3992
+ ${colors.bold}create${colors.reset} --title "..." [-p|--project <code>] [-t|--type <type>] [--complexity <c>] [--effort "<e>"] [--summary "<s>"] [--detail "<md>"] [--file <path>] [--json]
3889
3993
  Mint a new roadmap ticket with sequential numeric ID.
3890
3994
 
3891
3995
  ${colors.bold}update${colors.reset} <id> [-s|--status <status>] [-t|--type <type>] [--title "..."] [--complexity <c>] [--effort "<e>"] [--in-dev] [--flag <name>] [--last-hash <sha1>] [--force] [--json]
@@ -3894,7 +3998,7 @@ ${colors.bold}ROADMAP COMMANDS (Pair Programming & LLM Agents):${colors.reset}
3894
3998
  ${colors.bold}comment${colors.reset} <id> ["<text>"] [--text "..."] [--author "..."] [--json]
3895
3999
  Append a research finding, test verification, or note to ticket history.
3896
4000
 
3897
- ${colors.bold}snapshot${colors.reset} [--project <code>] [--json]
4001
+ ${colors.bold}snapshot, refresh${colors.reset} [--project <code>] [--json]
3898
4002
  Generate lean read-only projection snapshot (.esedre/snapshot.json) for zero-latency agent context.
3899
4003
 
3900
4004
  ${colors.bold}SERVICE DAEMON COMMANDS:${colors.reset}
@@ -3938,6 +4042,8 @@ ${colors.bold}OPTIONS:${colors.reset}
3938
4042
  -t, --type <type> Ticket type ('Feature', 'Platform', 'Tools', 'Idea', 'Bug').
3939
4043
  -s, --status <stat> Ticket status ('Planned', 'In Development', 'Completed', 'Rejected').
3940
4044
  -q, --search <query> Case-insensitive substring search query.
4045
+ --detail "<md>" Specification markdown for ticket detail during create.
4046
+ --file <path> Path to markdown file for detail (create) or implementation plan (plan).
3941
4047
  --json Output raw machine-readable JSON (strongly recommended for autonomous LLM coding agents).
3942
4048
  --last-hash <hash> Optimistic concurrency control: last known sha1 hash of the ticket from 'get'.
3943
4049
  --force Bypass optimistic concurrency last-hash conflict checks on writes.
@@ -4450,6 +4556,7 @@ ${colors.bold}Commands:${colors.reset}`);
4450
4556
  }
4451
4557
  return;
4452
4558
  }
4559
+ case "refresh":
4453
4560
  case "snapshot": {
4454
4561
  const projectCode = flags["project"] || discovered.config?.projectCode;
4455
4562
  if (!projectCode) {
@@ -4656,12 +4763,27 @@ ${colors.dim}Total: ${tickets.length} tickets${colors.reset}`);
4656
4763
  content = fs9.readFileSync(filePath, "utf-8");
4657
4764
  }
4658
4765
  await storage.savePlan(id, content, lastHash);
4659
- console.log(`${colors.green}\u2714 Implementation plan saved for Ticket #${id}${colors.reset}`);
4766
+ if (isJson) {
4767
+ const updated = await storage.getTicket(id);
4768
+ console.log(JSON.stringify({
4769
+ success: true,
4770
+ ticketId: id,
4771
+ project: updated?.projectDescriptor?.code || updated?.meta?.project || "UNASSIGNED",
4772
+ planMarkdown: content,
4773
+ sha1: updated?.sha1 || updated?.meta?.sha1
4774
+ }, null, 2));
4775
+ } else {
4776
+ console.log(`${colors.green}\u2714 Implementation plan saved for Ticket #${id}${colors.reset}`);
4777
+ }
4660
4778
  return;
4661
4779
  }
4662
4780
  const plan = await storage.getPlan(id);
4663
4781
  if (!plan) {
4664
- console.log(`${colors.dim}No implementation plan found for Ticket #${id}.${colors.reset}`);
4782
+ if (isJson) {
4783
+ console.log(JSON.stringify({ ticketId: id, planMarkdown: null }, null, 2));
4784
+ } else {
4785
+ console.log(`${colors.dim}No implementation plan found for Ticket #${id}.${colors.reset}`);
4786
+ }
4665
4787
  return;
4666
4788
  }
4667
4789
  if (isJson) {
@@ -4694,6 +4816,21 @@ ${colors.dim}Total: ${tickets.length} tickets${colors.reset}`);
4694
4816
  console.error(`${colors.red}Error: ${val.error}${colors.reset}`);
4695
4817
  process.exit(1);
4696
4818
  }
4819
+ const detailArg = flags["detail"];
4820
+ const fileArg = flags["file"];
4821
+ let detailMarkdown = detailArg;
4822
+ if (fileArg) {
4823
+ const filePath = path9.resolve(fileArg);
4824
+ if (!fs9.existsSync(filePath)) {
4825
+ if (isJson) {
4826
+ console.error(JSON.stringify({ error: `Detail file "${fileArg}" not found` }));
4827
+ } else {
4828
+ console.error(`${colors.red}Error: Detail file "${fileArg}" not found.${colors.reset}`);
4829
+ }
4830
+ process.exit(1);
4831
+ }
4832
+ detailMarkdown = fs9.readFileSync(filePath, "utf-8");
4833
+ }
4697
4834
  const created = await storage.createTicket({
4698
4835
  title,
4699
4836
  type,
@@ -4702,7 +4839,9 @@ ${colors.dim}Total: ${tickets.length} tickets${colors.reset}`);
4702
4839
  complexity,
4703
4840
  estimatedEffort,
4704
4841
  summary,
4705
- submittedBy
4842
+ submittedBy,
4843
+ detail: detailMarkdown,
4844
+ detailMarkdown
4706
4845
  });
4707
4846
  if (isJson) {
4708
4847
  console.log(JSON.stringify(created, null, 2));
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "esedre",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Esedre: Developer roadmap, ticketing, and LLM coding partner coordination platform",
5
- "homepage": "https://www.arwam.com",
5
+ "homepage": "https://arwam.com",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/Aellinsar/esedre.git"