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/marvin.js CHANGED
@@ -14313,6 +14313,60 @@ function createReportTools(store) {
14313
14313
  },
14314
14314
  { annotations: { readOnly: true } }
14315
14315
  ),
14316
+ tool2(
14317
+ "generate_sprint_progress",
14318
+ "Generate progress report for a sprint or all sprints, showing linked epics and tagged work items",
14319
+ {
14320
+ sprint: external_exports.string().optional().describe("Specific sprint ID (e.g. 'SP-001') or omit for all")
14321
+ },
14322
+ async (args) => {
14323
+ const allDocs = store.list();
14324
+ const sprintDocs = store.list({ type: "sprint" });
14325
+ const sprints = sprintDocs.filter((s) => !args.sprint || s.frontmatter.id === args.sprint).map((sprintDoc) => {
14326
+ const sprintId = sprintDoc.frontmatter.id;
14327
+ const linkedEpicIds = sprintDoc.frontmatter.linkedEpics ?? [];
14328
+ const linkedEpics = linkedEpicIds.map((epicId) => {
14329
+ const epic = store.get(epicId);
14330
+ return epic ? { id: epicId, title: epic.frontmatter.title, status: epic.frontmatter.status } : { id: epicId, title: "(not found)", status: "unknown" };
14331
+ });
14332
+ const workItems = allDocs.filter(
14333
+ (d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(`sprint:${sprintId}`)
14334
+ );
14335
+ const byStatus = {};
14336
+ for (const doc of workItems) {
14337
+ byStatus[doc.frontmatter.status] = (byStatus[doc.frontmatter.status] ?? 0) + 1;
14338
+ }
14339
+ const doneCount = (byStatus["done"] ?? 0) + (byStatus["resolved"] ?? 0) + (byStatus["closed"] ?? 0);
14340
+ const total = workItems.length;
14341
+ const completionPct = total > 0 ? Math.round(doneCount / total * 100) : 0;
14342
+ return {
14343
+ id: sprintDoc.frontmatter.id,
14344
+ title: sprintDoc.frontmatter.title,
14345
+ status: sprintDoc.frontmatter.status,
14346
+ goal: sprintDoc.frontmatter.goal,
14347
+ startDate: sprintDoc.frontmatter.startDate,
14348
+ endDate: sprintDoc.frontmatter.endDate,
14349
+ linkedEpics,
14350
+ workItems: {
14351
+ total,
14352
+ done: doneCount,
14353
+ completionPct,
14354
+ byStatus,
14355
+ items: workItems.map((d) => ({
14356
+ id: d.frontmatter.id,
14357
+ title: d.frontmatter.title,
14358
+ type: d.frontmatter.type,
14359
+ status: d.frontmatter.status
14360
+ }))
14361
+ }
14362
+ };
14363
+ });
14364
+ return {
14365
+ content: [{ type: "text", text: JSON.stringify({ sprints }, null, 2) }]
14366
+ };
14367
+ },
14368
+ { annotations: { readOnly: true } }
14369
+ ),
14316
14370
  tool2(
14317
14371
  "generate_feature_progress",
14318
14372
  "Generate progress report for features and their linked epics",
@@ -14359,7 +14413,7 @@ function createReportTools(store) {
14359
14413
  {
14360
14414
  title: external_exports.string().describe("Report title"),
14361
14415
  content: external_exports.string().describe("Full report content in markdown"),
14362
- reportType: external_exports.enum(["status", "risk-register", "gar", "epic-progress", "feature-progress", "custom"]).describe("Type of report"),
14416
+ reportType: external_exports.enum(["status", "risk-register", "gar", "epic-progress", "feature-progress", "sprint-progress", "custom"]).describe("Type of report"),
14363
14417
  tags: external_exports.array(external_exports.string()).optional().describe("Additional tags")
14364
14418
  },
14365
14419
  async (args) => {
@@ -14776,13 +14830,187 @@ function createContributionTools(store) {
14776
14830
  ];
14777
14831
  }
14778
14832
 
14833
+ // src/plugins/builtin/tools/sprints.ts
14834
+ import { tool as tool6 } from "@anthropic-ai/claude-agent-sdk";
14835
+ function createSprintTools(store) {
14836
+ return [
14837
+ tool6(
14838
+ "list_sprints",
14839
+ "List all sprints in the project, optionally filtered by status",
14840
+ {
14841
+ status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("Filter by sprint status")
14842
+ },
14843
+ async (args) => {
14844
+ const docs = store.list({ type: "sprint", status: args.status });
14845
+ const summary = docs.map((d) => ({
14846
+ id: d.frontmatter.id,
14847
+ title: d.frontmatter.title,
14848
+ status: d.frontmatter.status,
14849
+ goal: d.frontmatter.goal,
14850
+ startDate: d.frontmatter.startDate,
14851
+ endDate: d.frontmatter.endDate,
14852
+ linkedEpics: d.frontmatter.linkedEpics,
14853
+ tags: d.frontmatter.tags
14854
+ }));
14855
+ return {
14856
+ content: [{ type: "text", text: JSON.stringify(summary, null, 2) }]
14857
+ };
14858
+ },
14859
+ { annotations: { readOnly: true } }
14860
+ ),
14861
+ tool6(
14862
+ "get_sprint",
14863
+ "Get the full content of a specific sprint by ID",
14864
+ { id: external_exports.string().describe("Sprint ID (e.g. 'SP-001')") },
14865
+ async (args) => {
14866
+ const doc = store.get(args.id);
14867
+ if (!doc) {
14868
+ return {
14869
+ content: [{ type: "text", text: `Sprint ${args.id} not found` }],
14870
+ isError: true
14871
+ };
14872
+ }
14873
+ return {
14874
+ content: [
14875
+ {
14876
+ type: "text",
14877
+ text: JSON.stringify(
14878
+ { ...doc.frontmatter, content: doc.content },
14879
+ null,
14880
+ 2
14881
+ )
14882
+ }
14883
+ ]
14884
+ };
14885
+ },
14886
+ { annotations: { readOnly: true } }
14887
+ ),
14888
+ tool6(
14889
+ "create_sprint",
14890
+ "Create a new sprint with dates, goal, and optionally linked epics",
14891
+ {
14892
+ title: external_exports.string().describe("Sprint title"),
14893
+ content: external_exports.string().describe("Sprint description and objectives"),
14894
+ goal: external_exports.string().describe("Sprint goal \u2014 what this sprint aims to deliver"),
14895
+ startDate: external_exports.string().describe("Sprint start date (ISO format, e.g. '2026-03-01')"),
14896
+ endDate: external_exports.string().describe("Sprint end date (ISO format, e.g. '2026-03-14')"),
14897
+ status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("Sprint status (default: 'planned')"),
14898
+ 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."),
14899
+ tags: external_exports.array(external_exports.string()).optional().describe("Additional tags")
14900
+ },
14901
+ async (args) => {
14902
+ const warnings = [];
14903
+ if (args.linkedEpics) {
14904
+ for (const epicId of args.linkedEpics) {
14905
+ const epic = store.get(epicId);
14906
+ if (!epic) {
14907
+ warnings.push(`Epic ${epicId} not found (linked anyway)`);
14908
+ }
14909
+ }
14910
+ }
14911
+ const frontmatter = {
14912
+ title: args.title,
14913
+ status: args.status ?? "planned",
14914
+ goal: args.goal,
14915
+ startDate: args.startDate,
14916
+ endDate: args.endDate,
14917
+ linkedEpics: args.linkedEpics ?? [],
14918
+ tags: [...args.tags ?? []]
14919
+ };
14920
+ const doc = store.create("sprint", frontmatter, args.content);
14921
+ const sprintId = doc.frontmatter.id;
14922
+ if (args.linkedEpics) {
14923
+ for (const epicId of args.linkedEpics) {
14924
+ const epic = store.get(epicId);
14925
+ if (epic) {
14926
+ const existingTags = epic.frontmatter.tags ?? [];
14927
+ const sprintTag = `sprint:${sprintId}`;
14928
+ if (!existingTags.includes(sprintTag)) {
14929
+ store.update(epicId, { tags: [...existingTags, sprintTag] });
14930
+ }
14931
+ }
14932
+ }
14933
+ }
14934
+ const parts = [`Created sprint ${sprintId}: ${doc.frontmatter.title}`];
14935
+ if (warnings.length > 0) {
14936
+ parts.push(`Warnings: ${warnings.join("; ")}`);
14937
+ }
14938
+ return {
14939
+ content: [{ type: "text", text: parts.join("\n") }]
14940
+ };
14941
+ }
14942
+ ),
14943
+ tool6(
14944
+ "update_sprint",
14945
+ "Update an existing sprint. Cannot change id or type.",
14946
+ {
14947
+ id: external_exports.string().describe("Sprint ID to update"),
14948
+ title: external_exports.string().optional().describe("New title"),
14949
+ status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("New status"),
14950
+ content: external_exports.string().optional().describe("New content"),
14951
+ goal: external_exports.string().optional().describe("New sprint goal"),
14952
+ startDate: external_exports.string().optional().describe("New start date"),
14953
+ endDate: external_exports.string().optional().describe("New end date"),
14954
+ linkedEpics: external_exports.array(external_exports.string()).optional().describe("New list of linked epic IDs (replaces existing)"),
14955
+ tags: external_exports.array(external_exports.string()).optional().describe("New tags (replaces existing)")
14956
+ },
14957
+ async (args) => {
14958
+ const { id, content, linkedEpics, ...updates } = args;
14959
+ const existing = store.get(id);
14960
+ if (!existing) {
14961
+ return {
14962
+ content: [{ type: "text", text: `Sprint ${id} not found` }],
14963
+ isError: true
14964
+ };
14965
+ }
14966
+ if (linkedEpics !== void 0) {
14967
+ const oldLinked = existing.frontmatter.linkedEpics ?? [];
14968
+ const sprintTag = `sprint:${id}`;
14969
+ const removed = oldLinked.filter((e) => !linkedEpics.includes(e));
14970
+ for (const epicId of removed) {
14971
+ const epic = store.get(epicId);
14972
+ if (epic) {
14973
+ const tags = epic.frontmatter.tags ?? [];
14974
+ const filtered = tags.filter((t) => t !== sprintTag);
14975
+ if (filtered.length !== tags.length) {
14976
+ store.update(epicId, { tags: filtered });
14977
+ }
14978
+ }
14979
+ }
14980
+ const added = linkedEpics.filter((e) => !oldLinked.includes(e));
14981
+ for (const epicId of added) {
14982
+ const epic = store.get(epicId);
14983
+ if (epic) {
14984
+ const tags = epic.frontmatter.tags ?? [];
14985
+ if (!tags.includes(sprintTag)) {
14986
+ store.update(epicId, { tags: [...tags, sprintTag] });
14987
+ }
14988
+ }
14989
+ }
14990
+ updates.linkedEpics = linkedEpics;
14991
+ }
14992
+ const doc = store.update(id, updates, content);
14993
+ return {
14994
+ content: [
14995
+ {
14996
+ type: "text",
14997
+ text: `Updated sprint ${doc.frontmatter.id}: ${doc.frontmatter.title}`
14998
+ }
14999
+ ]
15000
+ };
15001
+ }
15002
+ )
15003
+ ];
15004
+ }
15005
+
14779
15006
  // src/plugins/common.ts
14780
15007
  var COMMON_REGISTRATIONS = [
14781
15008
  { type: "meeting", dirName: "meetings", idPrefix: "M" },
14782
15009
  { type: "report", dirName: "reports", idPrefix: "R" },
14783
15010
  { type: "feature", dirName: "features", idPrefix: "F" },
14784
15011
  { type: "epic", dirName: "epics", idPrefix: "E" },
14785
- { type: "contribution", dirName: "contributions", idPrefix: "C" }
15012
+ { type: "contribution", dirName: "contributions", idPrefix: "C" },
15013
+ { type: "sprint", dirName: "sprints", idPrefix: "SP" }
14786
15014
  ];
14787
15015
  function createCommonTools(store) {
14788
15016
  return [
@@ -14790,7 +15018,8 @@ function createCommonTools(store) {
14790
15018
  ...createReportTools(store),
14791
15019
  ...createFeatureTools(store),
14792
15020
  ...createEpicTools(store),
14793
- ...createContributionTools(store)
15021
+ ...createContributionTools(store),
15022
+ ...createSprintTools(store)
14794
15023
  ];
14795
15024
  }
14796
15025
 
@@ -14800,7 +15029,7 @@ var genericAgilePlugin = {
14800
15029
  name: "Generic Agile",
14801
15030
  description: "Default methodology plugin providing standard agile governance patterns for decisions, actions, and questions.",
14802
15031
  version: "0.1.0",
14803
- documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution"],
15032
+ documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution", "sprint"],
14804
15033
  documentTypeRegistrations: [...COMMON_REGISTRATIONS],
14805
15034
  tools: (store) => [...createCommonTools(store)],
14806
15035
  promptFragments: {
@@ -14827,7 +15056,10 @@ var genericAgilePlugin = {
14827
15056
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
14828
15057
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
14829
15058
  - **update_contribution**: Update a contribution (e.g. append effects).
14830
- - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.`,
15059
+ - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.
15060
+
15061
+ **Sprint Tools (read-only for awareness):**
15062
+ - **list_sprints** / **get_sprint**: View sprints to understand delivery timelines and iteration scope.`,
14831
15063
  "tech-lead": `You own epics and break approved features into implementation work.
14832
15064
 
14833
15065
  **Epic Tools:**
@@ -14854,7 +15086,13 @@ var genericAgilePlugin = {
14854
15086
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
14855
15087
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
14856
15088
  - **update_contribution**: Update a contribution (e.g. append effects).
14857
- - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.`,
15089
+ - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.
15090
+
15091
+ **Sprint Tools:**
15092
+ - **list_sprints** / **get_sprint**: View sprints to understand iteration scope and delivery dates.
15093
+ - **update_sprint**: Assign epics to sprints by updating linkedEpics when breaking features into work.
15094
+ - Tag technical actions and decisions with \`sprint:SP-xxx\` to associate them with a sprint.
15095
+ - Use **generate_sprint_progress** to track technical work completion within an iteration.`,
14858
15096
  "delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
14859
15097
 
14860
15098
  **Report Tools:**
@@ -14888,14 +15126,29 @@ var genericAgilePlugin = {
14888
15126
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
14889
15127
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
14890
15128
  - **update_contribution**: Update a contribution (e.g. append effects).
14891
- - Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.`,
14892
- "*": `You have access to feature, epic, and meeting tools for project coordination:
15129
+ - Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.
15130
+
15131
+ **Sprint Tools:**
15132
+ - **list_sprints** / **get_sprint**: Browse and read sprint definitions.
15133
+ - **create_sprint**: Create sprints with dates, goals, and linked epics. Use status "planned" for upcoming sprints or "active"/"completed"/"cancelled" for current/past sprints.
15134
+ - **update_sprint**: Update sprint status, dates, goal, or linked epics. When linkedEpics changes, affected epics are re-tagged automatically.
15135
+ - **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 %.
15136
+ - Use \`save_report\` with reportType "sprint-progress" to persist sprint reports.
15137
+
15138
+ **Sprint Workflow:**
15139
+ - Create sprints with clear goals and date boundaries.
15140
+ - Assign epics to sprints via linkedEpics.
15141
+ - Tag work items (actions, decisions, questions) with \`sprint:SP-xxx\` for sprint scoping.
15142
+ - Track delivery dates and flag at-risk sprints.
15143
+ - Register past/completed sprints for historical tracking.`,
15144
+ "*": `You have access to feature, epic, sprint, and meeting tools for project coordination:
14893
15145
 
14894
15146
  **Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
14895
15147
  **Epics** (E-xxx): Implementation work packages created by the Tech Lead, linked to approved features. Epics progress through planned \u2192 in-progress \u2192 done.
15148
+ **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).
14896
15149
  **Meetings**: Meeting records with attendees, agendas, and notes.
14897
15150
 
14898
- **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.
15151
+ **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.
14899
15152
 
14900
15153
  - **list_meetings** / **get_meeting**: Browse and read meeting records.
14901
15154
  - **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.
@@ -14910,10 +15163,10 @@ var genericAgilePlugin = {
14910
15163
  };
14911
15164
 
14912
15165
  // src/plugins/builtin/tools/use-cases.ts
14913
- import { tool as tool6 } from "@anthropic-ai/claude-agent-sdk";
15166
+ import { tool as tool7 } from "@anthropic-ai/claude-agent-sdk";
14914
15167
  function createUseCaseTools(store) {
14915
15168
  return [
14916
- tool6(
15169
+ tool7(
14917
15170
  "list_use_cases",
14918
15171
  "List all extension use cases, optionally filtered by status or extension type",
14919
15172
  {
@@ -14943,7 +15196,7 @@ function createUseCaseTools(store) {
14943
15196
  },
14944
15197
  { annotations: { readOnly: true } }
14945
15198
  ),
14946
- tool6(
15199
+ tool7(
14947
15200
  "get_use_case",
14948
15201
  "Get the full content of a specific use case by ID",
14949
15202
  { id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
@@ -14970,7 +15223,7 @@ function createUseCaseTools(store) {
14970
15223
  },
14971
15224
  { annotations: { readOnly: true } }
14972
15225
  ),
14973
- tool6(
15226
+ tool7(
14974
15227
  "create_use_case",
14975
15228
  "Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
14976
15229
  {
@@ -15004,7 +15257,7 @@ function createUseCaseTools(store) {
15004
15257
  };
15005
15258
  }
15006
15259
  ),
15007
- tool6(
15260
+ tool7(
15008
15261
  "update_use_case",
15009
15262
  "Update an existing extension use case",
15010
15263
  {
@@ -15034,10 +15287,10 @@ function createUseCaseTools(store) {
15034
15287
  }
15035
15288
 
15036
15289
  // src/plugins/builtin/tools/tech-assessments.ts
15037
- import { tool as tool7 } from "@anthropic-ai/claude-agent-sdk";
15290
+ import { tool as tool8 } from "@anthropic-ai/claude-agent-sdk";
15038
15291
  function createTechAssessmentTools(store) {
15039
15292
  return [
15040
- tool7(
15293
+ tool8(
15041
15294
  "list_tech_assessments",
15042
15295
  "List all technology assessments, optionally filtered by status",
15043
15296
  {
@@ -15068,7 +15321,7 @@ function createTechAssessmentTools(store) {
15068
15321
  },
15069
15322
  { annotations: { readOnly: true } }
15070
15323
  ),
15071
- tool7(
15324
+ tool8(
15072
15325
  "get_tech_assessment",
15073
15326
  "Get the full content of a specific technology assessment by ID",
15074
15327
  { id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
@@ -15095,7 +15348,7 @@ function createTechAssessmentTools(store) {
15095
15348
  },
15096
15349
  { annotations: { readOnly: true } }
15097
15350
  ),
15098
- tool7(
15351
+ tool8(
15099
15352
  "create_tech_assessment",
15100
15353
  "Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
15101
15354
  {
@@ -15166,7 +15419,7 @@ function createTechAssessmentTools(store) {
15166
15419
  };
15167
15420
  }
15168
15421
  ),
15169
- tool7(
15422
+ tool8(
15170
15423
  "update_tech_assessment",
15171
15424
  "Update an existing technology assessment. The linked use case cannot be changed.",
15172
15425
  {
@@ -15196,10 +15449,10 @@ function createTechAssessmentTools(store) {
15196
15449
  }
15197
15450
 
15198
15451
  // src/plugins/builtin/tools/extension-designs.ts
15199
- import { tool as tool8 } from "@anthropic-ai/claude-agent-sdk";
15452
+ import { tool as tool9 } from "@anthropic-ai/claude-agent-sdk";
15200
15453
  function createExtensionDesignTools(store) {
15201
15454
  return [
15202
- tool8(
15455
+ tool9(
15203
15456
  "list_extension_designs",
15204
15457
  "List all extension designs, optionally filtered by status",
15205
15458
  {
@@ -15229,7 +15482,7 @@ function createExtensionDesignTools(store) {
15229
15482
  },
15230
15483
  { annotations: { readOnly: true } }
15231
15484
  ),
15232
- tool8(
15485
+ tool9(
15233
15486
  "get_extension_design",
15234
15487
  "Get the full content of a specific extension design by ID",
15235
15488
  { id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
@@ -15256,7 +15509,7 @@ function createExtensionDesignTools(store) {
15256
15509
  },
15257
15510
  { annotations: { readOnly: true } }
15258
15511
  ),
15259
- tool8(
15512
+ tool9(
15260
15513
  "create_extension_design",
15261
15514
  "Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
15262
15515
  {
@@ -15324,7 +15577,7 @@ function createExtensionDesignTools(store) {
15324
15577
  };
15325
15578
  }
15326
15579
  ),
15327
- tool8(
15580
+ tool9(
15328
15581
  "update_extension_design",
15329
15582
  "Update an existing extension design. The linked tech assessment cannot be changed.",
15330
15583
  {
@@ -15353,10 +15606,10 @@ function createExtensionDesignTools(store) {
15353
15606
  }
15354
15607
 
15355
15608
  // src/plugins/builtin/tools/aem-reports.ts
15356
- import { tool as tool9 } from "@anthropic-ai/claude-agent-sdk";
15609
+ import { tool as tool10 } from "@anthropic-ai/claude-agent-sdk";
15357
15610
  function createAemReportTools(store) {
15358
15611
  return [
15359
- tool9(
15612
+ tool10(
15360
15613
  "generate_extension_portfolio",
15361
15614
  "Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
15362
15615
  {},
@@ -15408,7 +15661,7 @@ function createAemReportTools(store) {
15408
15661
  },
15409
15662
  { annotations: { readOnly: true } }
15410
15663
  ),
15411
- tool9(
15664
+ tool10(
15412
15665
  "generate_tech_readiness",
15413
15666
  "Generate a BTP technology readiness report showing service coverage and gaps across assessments",
15414
15667
  {},
@@ -15460,7 +15713,7 @@ function createAemReportTools(store) {
15460
15713
  },
15461
15714
  { annotations: { readOnly: true } }
15462
15715
  ),
15463
- tool9(
15716
+ tool10(
15464
15717
  "generate_phase_status",
15465
15718
  "Generate a phase progress report showing artifact counts and readiness per AEM phase",
15466
15719
  {},
@@ -15522,11 +15775,11 @@ function createAemReportTools(store) {
15522
15775
  import * as fs3 from "fs";
15523
15776
  import * as path3 from "path";
15524
15777
  import * as YAML2 from "yaml";
15525
- import { tool as tool10 } from "@anthropic-ai/claude-agent-sdk";
15778
+ import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
15526
15779
  var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
15527
15780
  function createAemPhaseTools(store, marvinDir) {
15528
15781
  return [
15529
- tool10(
15782
+ tool11(
15530
15783
  "get_current_phase",
15531
15784
  "Get the current AEM phase from project configuration",
15532
15785
  {},
@@ -15547,7 +15800,7 @@ function createAemPhaseTools(store, marvinDir) {
15547
15800
  },
15548
15801
  { annotations: { readOnly: true } }
15549
15802
  ),
15550
- tool10(
15803
+ tool11(
15551
15804
  "advance_phase",
15552
15805
  "Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
15553
15806
  {
@@ -15995,9 +16248,10 @@ var deliveryManager = {
15995
16248
  "Team coordination",
15996
16249
  "Process governance",
15997
16250
  "Status tracking",
15998
- "Epic scheduling and tracking"
16251
+ "Epic scheduling and tracking",
16252
+ "Sprint planning and tracking"
15999
16253
  ],
16000
- documentTypes: ["action", "decision", "meeting", "question", "feature", "epic"],
16254
+ documentTypes: ["action", "decision", "meeting", "question", "feature", "epic", "sprint"],
16001
16255
  contributionTypes: ["risk-finding", "blocker-report", "dependency-update", "status-assessment"]
16002
16256
  };
16003
16257
 
@@ -16034,9 +16288,10 @@ var techLead = {
16034
16288
  "Technical decisions",
16035
16289
  "Implementation guidance",
16036
16290
  "Non-functional requirements",
16037
- "Epic creation and scoping"
16291
+ "Epic creation and scoping",
16292
+ "Sprint scoping and technical execution"
16038
16293
  ],
16039
- documentTypes: ["decision", "action", "question", "epic"],
16294
+ documentTypes: ["decision", "action", "question", "epic", "sprint"],
16040
16295
  contributionTypes: ["action-result", "spike-findings", "technical-assessment", "architecture-review"]
16041
16296
  };
16042
16297
 
@@ -16095,6 +16350,7 @@ You have access to governance tools for managing project artifacts:
16095
16350
  - **Questions** (Q-xxx): List, get, create, and update questions
16096
16351
  - **Features** (F-xxx): List, get, create, and update feature definitions
16097
16352
  - **Epics** (E-xxx): List, get, create, and update implementation epics (must link to approved features)
16353
+ - **Sprints** (SP-xxx): List, get, create, and update time-boxed iterations with linked epics and delivery dates
16098
16354
  - **Documents**: Search and read any project document
16099
16355
  - **Sources**: List source documents and view their processing status and derived artifacts
16100
16356
 
@@ -16412,10 +16668,10 @@ import {
16412
16668
  } from "@anthropic-ai/claude-agent-sdk";
16413
16669
 
16414
16670
  // src/agent/tools/decisions.ts
16415
- import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
16671
+ import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
16416
16672
  function createDecisionTools(store) {
16417
16673
  return [
16418
- tool11(
16674
+ tool12(
16419
16675
  "list_decisions",
16420
16676
  "List all decisions in the project, optionally filtered by status",
16421
16677
  { status: external_exports.string().optional().describe("Filter by status (e.g. 'open', 'decided', 'superseded')") },
@@ -16433,7 +16689,7 @@ function createDecisionTools(store) {
16433
16689
  },
16434
16690
  { annotations: { readOnly: true } }
16435
16691
  ),
16436
- tool11(
16692
+ tool12(
16437
16693
  "get_decision",
16438
16694
  "Get the full content of a specific decision by ID",
16439
16695
  { id: external_exports.string().describe("Decision ID (e.g. 'D-001')") },
@@ -16460,7 +16716,7 @@ function createDecisionTools(store) {
16460
16716
  },
16461
16717
  { annotations: { readOnly: true } }
16462
16718
  ),
16463
- tool11(
16719
+ tool12(
16464
16720
  "create_decision",
16465
16721
  "Create a new decision record",
16466
16722
  {
@@ -16491,7 +16747,7 @@ function createDecisionTools(store) {
16491
16747
  };
16492
16748
  }
16493
16749
  ),
16494
- tool11(
16750
+ tool12(
16495
16751
  "update_decision",
16496
16752
  "Update an existing decision",
16497
16753
  {
@@ -16518,10 +16774,10 @@ function createDecisionTools(store) {
16518
16774
  }
16519
16775
 
16520
16776
  // src/agent/tools/actions.ts
16521
- import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
16777
+ import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
16522
16778
  function createActionTools(store) {
16523
16779
  return [
16524
- tool12(
16780
+ tool13(
16525
16781
  "list_actions",
16526
16782
  "List all action items in the project, optionally filtered by status or owner",
16527
16783
  {
@@ -16548,7 +16804,7 @@ function createActionTools(store) {
16548
16804
  },
16549
16805
  { annotations: { readOnly: true } }
16550
16806
  ),
16551
- tool12(
16807
+ tool13(
16552
16808
  "get_action",
16553
16809
  "Get the full content of a specific action item by ID",
16554
16810
  { id: external_exports.string().describe("Action ID (e.g. 'A-001')") },
@@ -16575,7 +16831,7 @@ function createActionTools(store) {
16575
16831
  },
16576
16832
  { annotations: { readOnly: true } }
16577
16833
  ),
16578
- tool12(
16834
+ tool13(
16579
16835
  "create_action",
16580
16836
  "Create a new action item",
16581
16837
  {
@@ -16608,7 +16864,7 @@ function createActionTools(store) {
16608
16864
  };
16609
16865
  }
16610
16866
  ),
16611
- tool12(
16867
+ tool13(
16612
16868
  "update_action",
16613
16869
  "Update an existing action item",
16614
16870
  {
@@ -16636,10 +16892,10 @@ function createActionTools(store) {
16636
16892
  }
16637
16893
 
16638
16894
  // src/agent/tools/questions.ts
16639
- import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
16895
+ import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
16640
16896
  function createQuestionTools(store) {
16641
16897
  return [
16642
- tool13(
16898
+ tool14(
16643
16899
  "list_questions",
16644
16900
  "List all questions in the project, optionally filtered by status",
16645
16901
  {
@@ -16660,7 +16916,7 @@ function createQuestionTools(store) {
16660
16916
  },
16661
16917
  { annotations: { readOnly: true } }
16662
16918
  ),
16663
- tool13(
16919
+ tool14(
16664
16920
  "get_question",
16665
16921
  "Get the full content of a specific question by ID",
16666
16922
  { id: external_exports.string().describe("Question ID (e.g. 'Q-001')") },
@@ -16687,7 +16943,7 @@ function createQuestionTools(store) {
16687
16943
  },
16688
16944
  { annotations: { readOnly: true } }
16689
16945
  ),
16690
- tool13(
16946
+ tool14(
16691
16947
  "create_question",
16692
16948
  "Create a new question that needs to be answered",
16693
16949
  {
@@ -16718,7 +16974,7 @@ function createQuestionTools(store) {
16718
16974
  };
16719
16975
  }
16720
16976
  ),
16721
- tool13(
16977
+ tool14(
16722
16978
  "update_question",
16723
16979
  "Update an existing question",
16724
16980
  {
@@ -16745,10 +17001,10 @@ function createQuestionTools(store) {
16745
17001
  }
16746
17002
 
16747
17003
  // src/agent/tools/documents.ts
16748
- import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
17004
+ import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
16749
17005
  function createDocumentTools(store) {
16750
17006
  return [
16751
- tool14(
17007
+ tool15(
16752
17008
  "search_documents",
16753
17009
  "Search all project documents, optionally filtered by type, status, or tag",
16754
17010
  {
@@ -16780,7 +17036,7 @@ function createDocumentTools(store) {
16780
17036
  },
16781
17037
  { annotations: { readOnly: true } }
16782
17038
  ),
16783
- tool14(
17039
+ tool15(
16784
17040
  "read_document",
16785
17041
  "Read the full content of any project document by ID",
16786
17042
  { id: external_exports.string().describe("Document ID (e.g. 'D-001', 'A-003', 'Q-002')") },
@@ -16807,7 +17063,7 @@ function createDocumentTools(store) {
16807
17063
  },
16808
17064
  { annotations: { readOnly: true } }
16809
17065
  ),
16810
- tool14(
17066
+ tool15(
16811
17067
  "project_summary",
16812
17068
  "Get a summary of all project documents and their counts",
16813
17069
  {},
@@ -16839,10 +17095,10 @@ function createDocumentTools(store) {
16839
17095
  }
16840
17096
 
16841
17097
  // src/agent/tools/sources.ts
16842
- import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
17098
+ import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
16843
17099
  function createSourceTools(manifest) {
16844
17100
  return [
16845
- tool15(
17101
+ tool16(
16846
17102
  "list_sources",
16847
17103
  "List all source documents and their processing status",
16848
17104
  {
@@ -16872,7 +17128,7 @@ function createSourceTools(manifest) {
16872
17128
  },
16873
17129
  { annotations: { readOnly: true } }
16874
17130
  ),
16875
- tool15(
17131
+ tool16(
16876
17132
  "get_source_info",
16877
17133
  "Get detailed information about a specific source document",
16878
17134
  {
@@ -16910,10 +17166,10 @@ function createSourceTools(manifest) {
16910
17166
  }
16911
17167
 
16912
17168
  // src/agent/tools/sessions.ts
16913
- import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
17169
+ import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
16914
17170
  function createSessionTools(store) {
16915
17171
  return [
16916
- tool16(
17172
+ tool17(
16917
17173
  "list_sessions",
16918
17174
  "List all saved chat sessions, sorted by most recently used",
16919
17175
  {
@@ -16937,7 +17193,7 @@ function createSessionTools(store) {
16937
17193
  },
16938
17194
  { annotations: { readOnly: true } }
16939
17195
  ),
16940
- tool16(
17196
+ tool17(
16941
17197
  "get_session",
16942
17198
  "Get details of a specific saved session by name",
16943
17199
  { name: external_exports.string().describe("Session name (e.g. 'jwt-auth-decision')") },
@@ -18526,7 +18782,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18526
18782
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
18527
18783
 
18528
18784
  // src/skills/action-tools.ts
18529
- import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
18785
+ import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
18530
18786
 
18531
18787
  // src/skills/action-runner.ts
18532
18788
  import { query as query4 } from "@anthropic-ai/claude-agent-sdk";
@@ -18592,7 +18848,7 @@ function createSkillActionTools(skills, context) {
18592
18848
  if (!skill.actions) continue;
18593
18849
  for (const action of skill.actions) {
18594
18850
  tools.push(
18595
- tool17(
18851
+ tool18(
18596
18852
  `${skill.id}__${action.id}`,
18597
18853
  action.description,
18598
18854
  {
@@ -18684,10 +18940,10 @@ ${lines.join("\n\n")}`;
18684
18940
  }
18685
18941
 
18686
18942
  // src/mcp/persona-tools.ts
18687
- import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
18943
+ import { tool as tool19 } from "@anthropic-ai/claude-agent-sdk";
18688
18944
  function createPersonaTools(ctx, marvinDir) {
18689
18945
  return [
18690
- tool18(
18946
+ tool19(
18691
18947
  "set_persona",
18692
18948
  "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.",
18693
18949
  {
@@ -18717,7 +18973,7 @@ ${summaries}`
18717
18973
  };
18718
18974
  }
18719
18975
  ),
18720
- tool18(
18976
+ tool19(
18721
18977
  "get_persona_guidance",
18722
18978
  "Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
18723
18979
  {
@@ -19332,7 +19588,8 @@ function getDirNameForType(store, type) {
19332
19588
  meeting: "meetings",
19333
19589
  report: "reports",
19334
19590
  feature: "features",
19335
- epic: "epics"
19591
+ epic: "epics",
19592
+ sprint: "sprints"
19336
19593
  };
19337
19594
  return typeDir[type] ?? `${type}s`;
19338
19595
  }
@@ -20239,7 +20496,7 @@ function createProgram() {
20239
20496
  const program2 = new Command();
20240
20497
  program2.name("marvin").description(
20241
20498
  "AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
20242
- ).version("0.2.4");
20499
+ ).version("0.2.5");
20243
20500
  program2.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
20244
20501
  await initCommand();
20245
20502
  });