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 +5 -5
- package/dist/esedre.mjs +151 -12
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](tests/)
|
|
11
|
-
[](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
|
|
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://
|
|
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.
|
|
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
|
|
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.
|
|
2967
|
+
## 0. Authoritative Ingress Hierarchy & Zero-Latency Context (\`.esedre/snapshot.json\`)
|
|
2893
2968
|
|
|
2894
|
-
|
|
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}
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Esedre: Developer roadmap, ticketing, and LLM coding partner coordination platform",
|
|
5
|
-
"homepage": "https://
|
|
5
|
+
"homepage": "https://arwam.com",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/Aellinsar/esedre.git"
|