mrvn-cli 0.2.4 → 0.2.5

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/dist/index.js CHANGED
@@ -438,9 +438,10 @@ var deliveryManager = {
438
438
  "Team coordination",
439
439
  "Process governance",
440
440
  "Status tracking",
441
- "Epic scheduling and tracking"
441
+ "Epic scheduling and tracking",
442
+ "Sprint planning and tracking"
442
443
  ],
443
- documentTypes: ["action", "decision", "meeting", "question", "feature", "epic"],
444
+ documentTypes: ["action", "decision", "meeting", "question", "feature", "epic", "sprint"],
444
445
  contributionTypes: ["risk-finding", "blocker-report", "dependency-update", "status-assessment"]
445
446
  };
446
447
 
@@ -477,9 +478,10 @@ var techLead = {
477
478
  "Technical decisions",
478
479
  "Implementation guidance",
479
480
  "Non-functional requirements",
480
- "Epic creation and scoping"
481
+ "Epic creation and scoping",
482
+ "Sprint scoping and technical execution"
481
483
  ],
482
- documentTypes: ["decision", "action", "question", "epic"],
484
+ documentTypes: ["decision", "action", "question", "epic", "sprint"],
483
485
  contributionTypes: ["action-result", "spike-findings", "technical-assessment", "architecture-review"]
484
486
  };
485
487
 
@@ -528,6 +530,7 @@ You have access to governance tools for managing project artifacts:
528
530
  - **Questions** (Q-xxx): List, get, create, and update questions
529
531
  - **Features** (F-xxx): List, get, create, and update feature definitions
530
532
  - **Epics** (E-xxx): List, get, create, and update implementation epics (must link to approved features)
533
+ - **Sprints** (SP-xxx): List, get, create, and update time-boxed iterations with linked epics and delivery dates
531
534
  - **Documents**: Search and read any project document
532
535
  - **Sources**: List source documents and view their processing status and derived artifacts
533
536
 
@@ -15511,6 +15514,60 @@ function createReportTools(store) {
15511
15514
  },
15512
15515
  { annotations: { readOnly: true } }
15513
15516
  ),
15517
+ tool8(
15518
+ "generate_sprint_progress",
15519
+ "Generate progress report for a sprint or all sprints, showing linked epics and tagged work items",
15520
+ {
15521
+ sprint: external_exports.string().optional().describe("Specific sprint ID (e.g. 'SP-001') or omit for all")
15522
+ },
15523
+ async (args) => {
15524
+ const allDocs = store.list();
15525
+ const sprintDocs = store.list({ type: "sprint" });
15526
+ const sprints = sprintDocs.filter((s) => !args.sprint || s.frontmatter.id === args.sprint).map((sprintDoc) => {
15527
+ const sprintId = sprintDoc.frontmatter.id;
15528
+ const linkedEpicIds = sprintDoc.frontmatter.linkedEpics ?? [];
15529
+ const linkedEpics = linkedEpicIds.map((epicId) => {
15530
+ const epic = store.get(epicId);
15531
+ return epic ? { id: epicId, title: epic.frontmatter.title, status: epic.frontmatter.status } : { id: epicId, title: "(not found)", status: "unknown" };
15532
+ });
15533
+ const workItems = allDocs.filter(
15534
+ (d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(`sprint:${sprintId}`)
15535
+ );
15536
+ const byStatus = {};
15537
+ for (const doc of workItems) {
15538
+ byStatus[doc.frontmatter.status] = (byStatus[doc.frontmatter.status] ?? 0) + 1;
15539
+ }
15540
+ const doneCount = (byStatus["done"] ?? 0) + (byStatus["resolved"] ?? 0) + (byStatus["closed"] ?? 0);
15541
+ const total = workItems.length;
15542
+ const completionPct = total > 0 ? Math.round(doneCount / total * 100) : 0;
15543
+ return {
15544
+ id: sprintDoc.frontmatter.id,
15545
+ title: sprintDoc.frontmatter.title,
15546
+ status: sprintDoc.frontmatter.status,
15547
+ goal: sprintDoc.frontmatter.goal,
15548
+ startDate: sprintDoc.frontmatter.startDate,
15549
+ endDate: sprintDoc.frontmatter.endDate,
15550
+ linkedEpics,
15551
+ workItems: {
15552
+ total,
15553
+ done: doneCount,
15554
+ completionPct,
15555
+ byStatus,
15556
+ items: workItems.map((d) => ({
15557
+ id: d.frontmatter.id,
15558
+ title: d.frontmatter.title,
15559
+ type: d.frontmatter.type,
15560
+ status: d.frontmatter.status
15561
+ }))
15562
+ }
15563
+ };
15564
+ });
15565
+ return {
15566
+ content: [{ type: "text", text: JSON.stringify({ sprints }, null, 2) }]
15567
+ };
15568
+ },
15569
+ { annotations: { readOnly: true } }
15570
+ ),
15514
15571
  tool8(
15515
15572
  "generate_feature_progress",
15516
15573
  "Generate progress report for features and their linked epics",
@@ -15557,7 +15614,7 @@ function createReportTools(store) {
15557
15614
  {
15558
15615
  title: external_exports.string().describe("Report title"),
15559
15616
  content: external_exports.string().describe("Full report content in markdown"),
15560
- reportType: external_exports.enum(["status", "risk-register", "gar", "epic-progress", "feature-progress", "custom"]).describe("Type of report"),
15617
+ reportType: external_exports.enum(["status", "risk-register", "gar", "epic-progress", "feature-progress", "sprint-progress", "custom"]).describe("Type of report"),
15561
15618
  tags: external_exports.array(external_exports.string()).optional().describe("Additional tags")
15562
15619
  },
15563
15620
  async (args) => {
@@ -15974,13 +16031,187 @@ function createContributionTools(store) {
15974
16031
  ];
15975
16032
  }
15976
16033
 
16034
+ // src/plugins/builtin/tools/sprints.ts
16035
+ import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
16036
+ function createSprintTools(store) {
16037
+ return [
16038
+ tool12(
16039
+ "list_sprints",
16040
+ "List all sprints in the project, optionally filtered by status",
16041
+ {
16042
+ status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("Filter by sprint status")
16043
+ },
16044
+ async (args) => {
16045
+ const docs = store.list({ type: "sprint", status: args.status });
16046
+ const summary = docs.map((d) => ({
16047
+ id: d.frontmatter.id,
16048
+ title: d.frontmatter.title,
16049
+ status: d.frontmatter.status,
16050
+ goal: d.frontmatter.goal,
16051
+ startDate: d.frontmatter.startDate,
16052
+ endDate: d.frontmatter.endDate,
16053
+ linkedEpics: d.frontmatter.linkedEpics,
16054
+ tags: d.frontmatter.tags
16055
+ }));
16056
+ return {
16057
+ content: [{ type: "text", text: JSON.stringify(summary, null, 2) }]
16058
+ };
16059
+ },
16060
+ { annotations: { readOnly: true } }
16061
+ ),
16062
+ tool12(
16063
+ "get_sprint",
16064
+ "Get the full content of a specific sprint by ID",
16065
+ { id: external_exports.string().describe("Sprint ID (e.g. 'SP-001')") },
16066
+ async (args) => {
16067
+ const doc = store.get(args.id);
16068
+ if (!doc) {
16069
+ return {
16070
+ content: [{ type: "text", text: `Sprint ${args.id} not found` }],
16071
+ isError: true
16072
+ };
16073
+ }
16074
+ return {
16075
+ content: [
16076
+ {
16077
+ type: "text",
16078
+ text: JSON.stringify(
16079
+ { ...doc.frontmatter, content: doc.content },
16080
+ null,
16081
+ 2
16082
+ )
16083
+ }
16084
+ ]
16085
+ };
16086
+ },
16087
+ { annotations: { readOnly: true } }
16088
+ ),
16089
+ tool12(
16090
+ "create_sprint",
16091
+ "Create a new sprint with dates, goal, and optionally linked epics",
16092
+ {
16093
+ title: external_exports.string().describe("Sprint title"),
16094
+ content: external_exports.string().describe("Sprint description and objectives"),
16095
+ goal: external_exports.string().describe("Sprint goal \u2014 what this sprint aims to deliver"),
16096
+ startDate: external_exports.string().describe("Sprint start date (ISO format, e.g. '2026-03-01')"),
16097
+ endDate: external_exports.string().describe("Sprint end date (ISO format, e.g. '2026-03-14')"),
16098
+ status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("Sprint status (default: 'planned')"),
16099
+ linkedEpics: external_exports.array(external_exports.string()).optional().describe("Epic IDs to link (e.g. ['E-001', 'E-003']). Soft-validated: warns if not found but still creates."),
16100
+ tags: external_exports.array(external_exports.string()).optional().describe("Additional tags")
16101
+ },
16102
+ async (args) => {
16103
+ const warnings = [];
16104
+ if (args.linkedEpics) {
16105
+ for (const epicId of args.linkedEpics) {
16106
+ const epic = store.get(epicId);
16107
+ if (!epic) {
16108
+ warnings.push(`Epic ${epicId} not found (linked anyway)`);
16109
+ }
16110
+ }
16111
+ }
16112
+ const frontmatter = {
16113
+ title: args.title,
16114
+ status: args.status ?? "planned",
16115
+ goal: args.goal,
16116
+ startDate: args.startDate,
16117
+ endDate: args.endDate,
16118
+ linkedEpics: args.linkedEpics ?? [],
16119
+ tags: [...args.tags ?? []]
16120
+ };
16121
+ const doc = store.create("sprint", frontmatter, args.content);
16122
+ const sprintId = doc.frontmatter.id;
16123
+ if (args.linkedEpics) {
16124
+ for (const epicId of args.linkedEpics) {
16125
+ const epic = store.get(epicId);
16126
+ if (epic) {
16127
+ const existingTags = epic.frontmatter.tags ?? [];
16128
+ const sprintTag = `sprint:${sprintId}`;
16129
+ if (!existingTags.includes(sprintTag)) {
16130
+ store.update(epicId, { tags: [...existingTags, sprintTag] });
16131
+ }
16132
+ }
16133
+ }
16134
+ }
16135
+ const parts = [`Created sprint ${sprintId}: ${doc.frontmatter.title}`];
16136
+ if (warnings.length > 0) {
16137
+ parts.push(`Warnings: ${warnings.join("; ")}`);
16138
+ }
16139
+ return {
16140
+ content: [{ type: "text", text: parts.join("\n") }]
16141
+ };
16142
+ }
16143
+ ),
16144
+ tool12(
16145
+ "update_sprint",
16146
+ "Update an existing sprint. Cannot change id or type.",
16147
+ {
16148
+ id: external_exports.string().describe("Sprint ID to update"),
16149
+ title: external_exports.string().optional().describe("New title"),
16150
+ status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("New status"),
16151
+ content: external_exports.string().optional().describe("New content"),
16152
+ goal: external_exports.string().optional().describe("New sprint goal"),
16153
+ startDate: external_exports.string().optional().describe("New start date"),
16154
+ endDate: external_exports.string().optional().describe("New end date"),
16155
+ linkedEpics: external_exports.array(external_exports.string()).optional().describe("New list of linked epic IDs (replaces existing)"),
16156
+ tags: external_exports.array(external_exports.string()).optional().describe("New tags (replaces existing)")
16157
+ },
16158
+ async (args) => {
16159
+ const { id, content, linkedEpics, ...updates } = args;
16160
+ const existing = store.get(id);
16161
+ if (!existing) {
16162
+ return {
16163
+ content: [{ type: "text", text: `Sprint ${id} not found` }],
16164
+ isError: true
16165
+ };
16166
+ }
16167
+ if (linkedEpics !== void 0) {
16168
+ const oldLinked = existing.frontmatter.linkedEpics ?? [];
16169
+ const sprintTag = `sprint:${id}`;
16170
+ const removed = oldLinked.filter((e) => !linkedEpics.includes(e));
16171
+ for (const epicId of removed) {
16172
+ const epic = store.get(epicId);
16173
+ if (epic) {
16174
+ const tags = epic.frontmatter.tags ?? [];
16175
+ const filtered = tags.filter((t) => t !== sprintTag);
16176
+ if (filtered.length !== tags.length) {
16177
+ store.update(epicId, { tags: filtered });
16178
+ }
16179
+ }
16180
+ }
16181
+ const added = linkedEpics.filter((e) => !oldLinked.includes(e));
16182
+ for (const epicId of added) {
16183
+ const epic = store.get(epicId);
16184
+ if (epic) {
16185
+ const tags = epic.frontmatter.tags ?? [];
16186
+ if (!tags.includes(sprintTag)) {
16187
+ store.update(epicId, { tags: [...tags, sprintTag] });
16188
+ }
16189
+ }
16190
+ }
16191
+ updates.linkedEpics = linkedEpics;
16192
+ }
16193
+ const doc = store.update(id, updates, content);
16194
+ return {
16195
+ content: [
16196
+ {
16197
+ type: "text",
16198
+ text: `Updated sprint ${doc.frontmatter.id}: ${doc.frontmatter.title}`
16199
+ }
16200
+ ]
16201
+ };
16202
+ }
16203
+ )
16204
+ ];
16205
+ }
16206
+
15977
16207
  // src/plugins/common.ts
15978
16208
  var COMMON_REGISTRATIONS = [
15979
16209
  { type: "meeting", dirName: "meetings", idPrefix: "M" },
15980
16210
  { type: "report", dirName: "reports", idPrefix: "R" },
15981
16211
  { type: "feature", dirName: "features", idPrefix: "F" },
15982
16212
  { type: "epic", dirName: "epics", idPrefix: "E" },
15983
- { type: "contribution", dirName: "contributions", idPrefix: "C" }
16213
+ { type: "contribution", dirName: "contributions", idPrefix: "C" },
16214
+ { type: "sprint", dirName: "sprints", idPrefix: "SP" }
15984
16215
  ];
15985
16216
  function createCommonTools(store) {
15986
16217
  return [
@@ -15988,7 +16219,8 @@ function createCommonTools(store) {
15988
16219
  ...createReportTools(store),
15989
16220
  ...createFeatureTools(store),
15990
16221
  ...createEpicTools(store),
15991
- ...createContributionTools(store)
16222
+ ...createContributionTools(store),
16223
+ ...createSprintTools(store)
15992
16224
  ];
15993
16225
  }
15994
16226
 
@@ -15998,7 +16230,7 @@ var genericAgilePlugin = {
15998
16230
  name: "Generic Agile",
15999
16231
  description: "Default methodology plugin providing standard agile governance patterns for decisions, actions, and questions.",
16000
16232
  version: "0.1.0",
16001
- documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution"],
16233
+ documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution", "sprint"],
16002
16234
  documentTypeRegistrations: [...COMMON_REGISTRATIONS],
16003
16235
  tools: (store) => [...createCommonTools(store)],
16004
16236
  promptFragments: {
@@ -16025,7 +16257,10 @@ var genericAgilePlugin = {
16025
16257
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
16026
16258
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
16027
16259
  - **update_contribution**: Update a contribution (e.g. append effects).
16028
- - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.`,
16260
+ - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.
16261
+
16262
+ **Sprint Tools (read-only for awareness):**
16263
+ - **list_sprints** / **get_sprint**: View sprints to understand delivery timelines and iteration scope.`,
16029
16264
  "tech-lead": `You own epics and break approved features into implementation work.
16030
16265
 
16031
16266
  **Epic Tools:**
@@ -16052,7 +16287,13 @@ var genericAgilePlugin = {
16052
16287
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
16053
16288
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
16054
16289
  - **update_contribution**: Update a contribution (e.g. append effects).
16055
- - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.`,
16290
+ - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.
16291
+
16292
+ **Sprint Tools:**
16293
+ - **list_sprints** / **get_sprint**: View sprints to understand iteration scope and delivery dates.
16294
+ - **update_sprint**: Assign epics to sprints by updating linkedEpics when breaking features into work.
16295
+ - Tag technical actions and decisions with \`sprint:SP-xxx\` to associate them with a sprint.
16296
+ - Use **generate_sprint_progress** to track technical work completion within an iteration.`,
16056
16297
  "delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
16057
16298
 
16058
16299
  **Report Tools:**
@@ -16086,14 +16327,29 @@ var genericAgilePlugin = {
16086
16327
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
16087
16328
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
16088
16329
  - **update_contribution**: Update a contribution (e.g. append effects).
16089
- - Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.`,
16090
- "*": `You have access to feature, epic, and meeting tools for project coordination:
16330
+ - Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.
16331
+
16332
+ **Sprint Tools:**
16333
+ - **list_sprints** / **get_sprint**: Browse and read sprint definitions.
16334
+ - **create_sprint**: Create sprints with dates, goals, and linked epics. Use status "planned" for upcoming sprints or "active"/"completed"/"cancelled" for current/past sprints.
16335
+ - **update_sprint**: Update sprint status, dates, goal, or linked epics. When linkedEpics changes, affected epics are re-tagged automatically.
16336
+ - **generate_sprint_progress**: Progress report for a specific sprint or all sprints \u2014 shows linked epics with statuses, work items tagged \`sprint:SP-xxx\` grouped by status, and done/total completion %.
16337
+ - Use \`save_report\` with reportType "sprint-progress" to persist sprint reports.
16338
+
16339
+ **Sprint Workflow:**
16340
+ - Create sprints with clear goals and date boundaries.
16341
+ - Assign epics to sprints via linkedEpics.
16342
+ - Tag work items (actions, decisions, questions) with \`sprint:SP-xxx\` for sprint scoping.
16343
+ - Track delivery dates and flag at-risk sprints.
16344
+ - Register past/completed sprints for historical tracking.`,
16345
+ "*": `You have access to feature, epic, sprint, and meeting tools for project coordination:
16091
16346
 
16092
16347
  **Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
16093
16348
  **Epics** (E-xxx): Implementation work packages created by the Tech Lead, linked to approved features. Epics progress through planned \u2192 in-progress \u2192 done.
16349
+ **Sprints** (SP-xxx): Time-boxed iterations that group epics and work items with delivery dates. Sprints progress through planned \u2192 active \u2192 completed (or cancelled).
16094
16350
  **Meetings**: Meeting records with attendees, agendas, and notes.
16095
16351
 
16096
- **Key workflow rule:** Epics must link to approved features \u2014 the system enforces this. The Product Owner defines and approves features, the Tech Lead breaks them into epics, and the Delivery Manager tracks dates and progress.
16352
+ **Key workflow rule:** Epics must link to approved features \u2014 the system enforces this. The Product Owner defines and approves features, the Tech Lead breaks them into epics, the Delivery Manager plans sprints and tracks dates and progress. Work items are associated with sprints via \`sprint:SP-xxx\` tags.
16097
16353
 
16098
16354
  - **list_meetings** / **get_meeting**: Browse and read meeting records.
16099
16355
  - **create_meeting**: Record meetings with attendees, date, and agenda. The meeting date is required \u2014 extract it from the meeting content or ask the user if not found.
@@ -16108,10 +16364,10 @@ var genericAgilePlugin = {
16108
16364
  };
16109
16365
 
16110
16366
  // src/plugins/builtin/tools/use-cases.ts
16111
- import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
16367
+ import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
16112
16368
  function createUseCaseTools(store) {
16113
16369
  return [
16114
- tool12(
16370
+ tool13(
16115
16371
  "list_use_cases",
16116
16372
  "List all extension use cases, optionally filtered by status or extension type",
16117
16373
  {
@@ -16141,7 +16397,7 @@ function createUseCaseTools(store) {
16141
16397
  },
16142
16398
  { annotations: { readOnly: true } }
16143
16399
  ),
16144
- tool12(
16400
+ tool13(
16145
16401
  "get_use_case",
16146
16402
  "Get the full content of a specific use case by ID",
16147
16403
  { id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
@@ -16168,7 +16424,7 @@ function createUseCaseTools(store) {
16168
16424
  },
16169
16425
  { annotations: { readOnly: true } }
16170
16426
  ),
16171
- tool12(
16427
+ tool13(
16172
16428
  "create_use_case",
16173
16429
  "Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
16174
16430
  {
@@ -16202,7 +16458,7 @@ function createUseCaseTools(store) {
16202
16458
  };
16203
16459
  }
16204
16460
  ),
16205
- tool12(
16461
+ tool13(
16206
16462
  "update_use_case",
16207
16463
  "Update an existing extension use case",
16208
16464
  {
@@ -16232,10 +16488,10 @@ function createUseCaseTools(store) {
16232
16488
  }
16233
16489
 
16234
16490
  // src/plugins/builtin/tools/tech-assessments.ts
16235
- import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
16491
+ import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
16236
16492
  function createTechAssessmentTools(store) {
16237
16493
  return [
16238
- tool13(
16494
+ tool14(
16239
16495
  "list_tech_assessments",
16240
16496
  "List all technology assessments, optionally filtered by status",
16241
16497
  {
@@ -16266,7 +16522,7 @@ function createTechAssessmentTools(store) {
16266
16522
  },
16267
16523
  { annotations: { readOnly: true } }
16268
16524
  ),
16269
- tool13(
16525
+ tool14(
16270
16526
  "get_tech_assessment",
16271
16527
  "Get the full content of a specific technology assessment by ID",
16272
16528
  { id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
@@ -16293,7 +16549,7 @@ function createTechAssessmentTools(store) {
16293
16549
  },
16294
16550
  { annotations: { readOnly: true } }
16295
16551
  ),
16296
- tool13(
16552
+ tool14(
16297
16553
  "create_tech_assessment",
16298
16554
  "Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
16299
16555
  {
@@ -16364,7 +16620,7 @@ function createTechAssessmentTools(store) {
16364
16620
  };
16365
16621
  }
16366
16622
  ),
16367
- tool13(
16623
+ tool14(
16368
16624
  "update_tech_assessment",
16369
16625
  "Update an existing technology assessment. The linked use case cannot be changed.",
16370
16626
  {
@@ -16394,10 +16650,10 @@ function createTechAssessmentTools(store) {
16394
16650
  }
16395
16651
 
16396
16652
  // src/plugins/builtin/tools/extension-designs.ts
16397
- import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
16653
+ import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
16398
16654
  function createExtensionDesignTools(store) {
16399
16655
  return [
16400
- tool14(
16656
+ tool15(
16401
16657
  "list_extension_designs",
16402
16658
  "List all extension designs, optionally filtered by status",
16403
16659
  {
@@ -16427,7 +16683,7 @@ function createExtensionDesignTools(store) {
16427
16683
  },
16428
16684
  { annotations: { readOnly: true } }
16429
16685
  ),
16430
- tool14(
16686
+ tool15(
16431
16687
  "get_extension_design",
16432
16688
  "Get the full content of a specific extension design by ID",
16433
16689
  { id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
@@ -16454,7 +16710,7 @@ function createExtensionDesignTools(store) {
16454
16710
  },
16455
16711
  { annotations: { readOnly: true } }
16456
16712
  ),
16457
- tool14(
16713
+ tool15(
16458
16714
  "create_extension_design",
16459
16715
  "Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
16460
16716
  {
@@ -16522,7 +16778,7 @@ function createExtensionDesignTools(store) {
16522
16778
  };
16523
16779
  }
16524
16780
  ),
16525
- tool14(
16781
+ tool15(
16526
16782
  "update_extension_design",
16527
16783
  "Update an existing extension design. The linked tech assessment cannot be changed.",
16528
16784
  {
@@ -16551,10 +16807,10 @@ function createExtensionDesignTools(store) {
16551
16807
  }
16552
16808
 
16553
16809
  // src/plugins/builtin/tools/aem-reports.ts
16554
- import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
16810
+ import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
16555
16811
  function createAemReportTools(store) {
16556
16812
  return [
16557
- tool15(
16813
+ tool16(
16558
16814
  "generate_extension_portfolio",
16559
16815
  "Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
16560
16816
  {},
@@ -16606,7 +16862,7 @@ function createAemReportTools(store) {
16606
16862
  },
16607
16863
  { annotations: { readOnly: true } }
16608
16864
  ),
16609
- tool15(
16865
+ tool16(
16610
16866
  "generate_tech_readiness",
16611
16867
  "Generate a BTP technology readiness report showing service coverage and gaps across assessments",
16612
16868
  {},
@@ -16658,7 +16914,7 @@ function createAemReportTools(store) {
16658
16914
  },
16659
16915
  { annotations: { readOnly: true } }
16660
16916
  ),
16661
- tool15(
16917
+ tool16(
16662
16918
  "generate_phase_status",
16663
16919
  "Generate a phase progress report showing artifact counts and readiness per AEM phase",
16664
16920
  {},
@@ -16720,11 +16976,11 @@ function createAemReportTools(store) {
16720
16976
  import * as fs6 from "fs";
16721
16977
  import * as path6 from "path";
16722
16978
  import * as YAML4 from "yaml";
16723
- import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
16979
+ import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
16724
16980
  var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
16725
16981
  function createAemPhaseTools(store, marvinDir) {
16726
16982
  return [
16727
- tool16(
16983
+ tool17(
16728
16984
  "get_current_phase",
16729
16985
  "Get the current AEM phase from project configuration",
16730
16986
  {},
@@ -16745,7 +17001,7 @@ function createAemPhaseTools(store, marvinDir) {
16745
17001
  },
16746
17002
  { annotations: { readOnly: true } }
16747
17003
  ),
16748
- tool16(
17004
+ tool17(
16749
17005
  "advance_phase",
16750
17006
  "Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
16751
17007
  {
@@ -17520,7 +17776,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
17520
17776
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
17521
17777
 
17522
17778
  // src/skills/action-tools.ts
17523
- import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
17779
+ import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
17524
17780
 
17525
17781
  // src/skills/action-runner.ts
17526
17782
  import { query as query3 } from "@anthropic-ai/claude-agent-sdk";
@@ -17586,7 +17842,7 @@ function createSkillActionTools(skills, context) {
17586
17842
  if (!skill.actions) continue;
17587
17843
  for (const action of skill.actions) {
17588
17844
  tools.push(
17589
- tool17(
17845
+ tool18(
17590
17846
  `${skill.id}__${action.id}`,
17591
17847
  action.description,
17592
17848
  {
@@ -17678,10 +17934,10 @@ ${lines.join("\n\n")}`;
17678
17934
  }
17679
17935
 
17680
17936
  // src/mcp/persona-tools.ts
17681
- import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
17937
+ import { tool as tool19 } from "@anthropic-ai/claude-agent-sdk";
17682
17938
  function createPersonaTools(ctx, marvinDir) {
17683
17939
  return [
17684
- tool18(
17940
+ tool19(
17685
17941
  "set_persona",
17686
17942
  "Set the active persona for this session. Returns full guidance for the selected persona including behavioral rules, allowed document types, and scope. Call this before working to ensure persona-appropriate behavior.",
17687
17943
  {
@@ -17711,7 +17967,7 @@ ${summaries}`
17711
17967
  };
17712
17968
  }
17713
17969
  ),
17714
- tool18(
17970
+ tool19(
17715
17971
  "get_persona_guidance",
17716
17972
  "Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
17717
17973
  {
@@ -19338,7 +19594,8 @@ function getDirNameForType(store, type) {
19338
19594
  meeting: "meetings",
19339
19595
  report: "reports",
19340
19596
  feature: "features",
19341
- epic: "epics"
19597
+ epic: "epics",
19598
+ sprint: "sprints"
19342
19599
  };
19343
19600
  return typeDir[type] ?? `${type}s`;
19344
19601
  }
@@ -20245,7 +20502,7 @@ function createProgram() {
20245
20502
  const program = new Command();
20246
20503
  program.name("marvin").description(
20247
20504
  "AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
20248
- ).version("0.2.4");
20505
+ ).version("0.2.5");
20249
20506
  program.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
20250
20507
  await initCommand();
20251
20508
  });