mrvn-cli 0.2.4 → 0.2.6

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,369 @@ 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
+
15006
+ // src/plugins/builtin/tools/sprint-planning.ts
15007
+ import { tool as tool7 } from "@anthropic-ai/claude-agent-sdk";
15008
+ var PRIORITY_ORDER = {
15009
+ critical: 0,
15010
+ high: 1,
15011
+ medium: 2,
15012
+ low: 3
15013
+ };
15014
+ function priorityRank(p) {
15015
+ return PRIORITY_ORDER[p ?? ""] ?? 99;
15016
+ }
15017
+ function createSprintPlanningTools(store) {
15018
+ return [
15019
+ tool7(
15020
+ "gather_sprint_planning_context",
15021
+ "Aggregate all planning-relevant data for proposing the next sprint: approved features, backlog epics, active sprint, velocity reference, blockers, and summary stats",
15022
+ {
15023
+ focusFeature: external_exports.string().optional().describe("Filter backlog to epics of a specific feature ID (e.g. 'F-001')"),
15024
+ sprintDurationDays: external_exports.number().optional().describe("Expected sprint duration in days \u2014 passed through for capacity reasoning")
15025
+ },
15026
+ async (args) => {
15027
+ const features = store.list({ type: "feature" });
15028
+ const epics = store.list({ type: "epic" });
15029
+ const sprints = store.list({ type: "sprint" });
15030
+ const questions = store.list({ type: "question", status: "open" });
15031
+ const contributions = store.list({ type: "contribution" });
15032
+ const approvedFeatures = features.filter((f) => f.frontmatter.status === "approved").sort((a, b) => priorityRank(a.frontmatter.priority) - priorityRank(b.frontmatter.priority)).map((f) => {
15033
+ const linkedEpics = epics.filter((e) => e.frontmatter.linkedFeature === f.frontmatter.id);
15034
+ const epicsByStatus = {};
15035
+ for (const e of linkedEpics) {
15036
+ epicsByStatus[e.frontmatter.status] = (epicsByStatus[e.frontmatter.status] ?? 0) + 1;
15037
+ }
15038
+ return {
15039
+ id: f.frontmatter.id,
15040
+ title: f.frontmatter.title,
15041
+ priority: f.frontmatter.priority,
15042
+ owner: f.frontmatter.owner,
15043
+ epicCount: linkedEpics.length,
15044
+ epicsByStatus
15045
+ };
15046
+ });
15047
+ const assignedEpicIds = /* @__PURE__ */ new Set();
15048
+ for (const sp of sprints) {
15049
+ const linked = sp.frontmatter.linkedEpics ?? [];
15050
+ for (const id of linked) assignedEpicIds.add(id);
15051
+ }
15052
+ const featureMap = new Map(features.map((f) => [f.frontmatter.id, f]));
15053
+ let backlogEpics = epics.filter(
15054
+ (e) => !assignedEpicIds.has(e.frontmatter.id) && e.frontmatter.status !== "done"
15055
+ );
15056
+ if (args.focusFeature) {
15057
+ backlogEpics = backlogEpics.filter(
15058
+ (e) => e.frontmatter.linkedFeature === args.focusFeature
15059
+ );
15060
+ }
15061
+ const backlog = backlogEpics.sort((a, b) => {
15062
+ const fa = featureMap.get(a.frontmatter.linkedFeature);
15063
+ const fb = featureMap.get(b.frontmatter.linkedFeature);
15064
+ return priorityRank(fa?.frontmatter.priority) - priorityRank(fb?.frontmatter.priority);
15065
+ }).map((e) => {
15066
+ const parent = featureMap.get(e.frontmatter.linkedFeature);
15067
+ return {
15068
+ id: e.frontmatter.id,
15069
+ title: e.frontmatter.title,
15070
+ status: e.frontmatter.status,
15071
+ linkedFeature: e.frontmatter.linkedFeature,
15072
+ featureTitle: parent?.frontmatter.title ?? null,
15073
+ featurePriority: parent?.frontmatter.priority ?? null,
15074
+ estimatedEffort: e.frontmatter.estimatedEffort ?? null,
15075
+ targetDate: e.frontmatter.targetDate ?? null
15076
+ };
15077
+ });
15078
+ const activeSprintDoc = sprints.find((s) => s.frontmatter.status === "active") ?? null;
15079
+ let activeSprint = null;
15080
+ if (activeSprintDoc) {
15081
+ const linkedEpicIds = activeSprintDoc.frontmatter.linkedEpics ?? [];
15082
+ const linkedEpics = linkedEpicIds.map((epicId) => {
15083
+ const epic = store.get(epicId);
15084
+ return epic ? { id: epicId, title: epic.frontmatter.title, status: epic.frontmatter.status } : { id: epicId, title: "(not found)", status: "unknown" };
15085
+ });
15086
+ const allDocs = store.list();
15087
+ const sprintTag = `sprint:${activeSprintDoc.frontmatter.id}`;
15088
+ const workItems = allDocs.filter(
15089
+ (d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(sprintTag)
15090
+ );
15091
+ const doneCount = workItems.filter(
15092
+ (d) => d.frontmatter.status === "done" || d.frontmatter.status === "resolved" || d.frontmatter.status === "closed"
15093
+ ).length;
15094
+ const completionPct = workItems.length > 0 ? Math.round(doneCount / workItems.length * 100) : 0;
15095
+ activeSprint = {
15096
+ id: activeSprintDoc.frontmatter.id,
15097
+ title: activeSprintDoc.frontmatter.title,
15098
+ goal: activeSprintDoc.frontmatter.goal,
15099
+ startDate: activeSprintDoc.frontmatter.startDate,
15100
+ endDate: activeSprintDoc.frontmatter.endDate,
15101
+ linkedEpics,
15102
+ workItems: { total: workItems.length, done: doneCount, completionPct }
15103
+ };
15104
+ }
15105
+ const completedSprints = sprints.filter((s) => s.frontmatter.status === "completed").sort((a, b) => {
15106
+ const da = a.frontmatter.endDate ?? "";
15107
+ const db = b.frontmatter.endDate ?? "";
15108
+ return da < db ? 1 : da > db ? -1 : 0;
15109
+ }).slice(0, 2);
15110
+ const velocityReference = completedSprints.map((sp) => {
15111
+ const linkedEpicIds = sp.frontmatter.linkedEpics ?? [];
15112
+ const efforts = [];
15113
+ for (const epicId of linkedEpicIds) {
15114
+ const epic = store.get(epicId);
15115
+ if (epic?.frontmatter.estimatedEffort) {
15116
+ efforts.push(String(epic.frontmatter.estimatedEffort));
15117
+ }
15118
+ }
15119
+ const allDocs = store.list();
15120
+ const sprintTag = `sprint:${sp.frontmatter.id}`;
15121
+ const workItems = allDocs.filter(
15122
+ (d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(sprintTag)
15123
+ );
15124
+ return {
15125
+ id: sp.frontmatter.id,
15126
+ title: sp.frontmatter.title,
15127
+ startDate: sp.frontmatter.startDate,
15128
+ endDate: sp.frontmatter.endDate,
15129
+ epicCount: linkedEpicIds.length,
15130
+ efforts,
15131
+ workItemCount: workItems.length
15132
+ };
15133
+ });
15134
+ const openBlockerContributions = contributions.filter(
15135
+ (c) => c.frontmatter.status === "open" && (c.frontmatter.contributionType === "risk-finding" || c.frontmatter.contributionType === "blocker-report")
15136
+ );
15137
+ const blockers = {
15138
+ openQuestions: questions.map((q) => ({
15139
+ id: q.frontmatter.id,
15140
+ title: q.frontmatter.title
15141
+ })),
15142
+ openRiskAndBlockerContributions: openBlockerContributions.map((c) => ({
15143
+ id: c.frontmatter.id,
15144
+ title: c.frontmatter.title,
15145
+ contributionType: c.frontmatter.contributionType
15146
+ }))
15147
+ };
15148
+ const totalBacklogEfforts = backlog.filter((e) => e.estimatedEffort !== null).map((e) => String(e.estimatedEffort));
15149
+ const approvedFeaturesWithNoEpics = approvedFeatures.filter((f) => f.epicCount === 0).map((f) => ({ id: f.id, title: f.title }));
15150
+ const now = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
15151
+ const epicsAtRisk = epics.filter((e) => {
15152
+ if (e.frontmatter.status === "done") return false;
15153
+ if (e.frontmatter.targetDate && e.frontmatter.targetDate < now) return true;
15154
+ const parent = featureMap.get(e.frontmatter.linkedFeature);
15155
+ if (parent?.frontmatter.status === "deferred") return true;
15156
+ return false;
15157
+ }).map((e) => ({
15158
+ id: e.frontmatter.id,
15159
+ title: e.frontmatter.title,
15160
+ reason: e.frontmatter.targetDate && e.frontmatter.targetDate < now ? "past-target-date" : "deferred-feature"
15161
+ }));
15162
+ const plannedSprintCount = sprints.filter((s) => s.frontmatter.status === "planned").length;
15163
+ const summary = {
15164
+ totalBacklogEpics: backlog.length,
15165
+ totalBacklogEfforts,
15166
+ approvedFeaturesWithNoEpics,
15167
+ epicsAtRisk,
15168
+ plannedSprintCount
15169
+ };
15170
+ const result = {
15171
+ approvedFeatures,
15172
+ backlog,
15173
+ activeSprint,
15174
+ velocityReference,
15175
+ blockers,
15176
+ summary,
15177
+ ...args.sprintDurationDays !== void 0 ? { sprintDurationDays: args.sprintDurationDays } : {}
15178
+ };
15179
+ return {
15180
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
15181
+ };
15182
+ },
15183
+ { annotations: { readOnly: true } }
15184
+ )
15185
+ ];
15186
+ }
15187
+
14779
15188
  // src/plugins/common.ts
14780
15189
  var COMMON_REGISTRATIONS = [
14781
15190
  { type: "meeting", dirName: "meetings", idPrefix: "M" },
14782
15191
  { type: "report", dirName: "reports", idPrefix: "R" },
14783
15192
  { type: "feature", dirName: "features", idPrefix: "F" },
14784
15193
  { type: "epic", dirName: "epics", idPrefix: "E" },
14785
- { type: "contribution", dirName: "contributions", idPrefix: "C" }
15194
+ { type: "contribution", dirName: "contributions", idPrefix: "C" },
15195
+ { type: "sprint", dirName: "sprints", idPrefix: "SP" }
14786
15196
  ];
14787
15197
  function createCommonTools(store) {
14788
15198
  return [
@@ -14790,7 +15200,9 @@ function createCommonTools(store) {
14790
15200
  ...createReportTools(store),
14791
15201
  ...createFeatureTools(store),
14792
15202
  ...createEpicTools(store),
14793
- ...createContributionTools(store)
15203
+ ...createContributionTools(store),
15204
+ ...createSprintTools(store),
15205
+ ...createSprintPlanningTools(store)
14794
15206
  ];
14795
15207
  }
14796
15208
 
@@ -14800,7 +15212,7 @@ var genericAgilePlugin = {
14800
15212
  name: "Generic Agile",
14801
15213
  description: "Default methodology plugin providing standard agile governance patterns for decisions, actions, and questions.",
14802
15214
  version: "0.1.0",
14803
- documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution"],
15215
+ documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution", "sprint"],
14804
15216
  documentTypeRegistrations: [...COMMON_REGISTRATIONS],
14805
15217
  tools: (store) => [...createCommonTools(store)],
14806
15218
  promptFragments: {
@@ -14827,7 +15239,10 @@ var genericAgilePlugin = {
14827
15239
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
14828
15240
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
14829
15241
  - **update_contribution**: Update a contribution (e.g. append effects).
14830
- - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.`,
15242
+ - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.
15243
+
15244
+ **Sprint Tools (read-only for awareness):**
15245
+ - **list_sprints** / **get_sprint**: View sprints to understand delivery timelines and iteration scope.`,
14831
15246
  "tech-lead": `You own epics and break approved features into implementation work.
14832
15247
 
14833
15248
  **Epic Tools:**
@@ -14854,7 +15269,18 @@ var genericAgilePlugin = {
14854
15269
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
14855
15270
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
14856
15271
  - **update_contribution**: Update a contribution (e.g. append effects).
14857
- - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.`,
15272
+ - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.
15273
+
15274
+ **Sprint Tools:**
15275
+ - **list_sprints** / **get_sprint**: View sprints to understand iteration scope and delivery dates.
15276
+ - **update_sprint**: Assign epics to sprints by updating linkedEpics when breaking features into work.
15277
+ - Tag technical actions and decisions with \`sprint:SP-xxx\` to associate them with a sprint.
15278
+ - Use **generate_sprint_progress** to track technical work completion within an iteration.
15279
+
15280
+ **Sprint Planning:**
15281
+ - When asked to plan or propose a sprint, ALWAYS call **gather_sprint_planning_context** first.
15282
+ - Focus on: technical readiness of each epic, open technical questions or spikes, effort balance across the sprint, and feature coverage.
15283
+ - Present a structured sprint proposal with technical rationale for each selected epic, known technical risks, and any prerequisite work that should be completed first.`,
14858
15284
  "delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
14859
15285
 
14860
15286
  **Report Tools:**
@@ -14888,14 +15314,35 @@ var genericAgilePlugin = {
14888
15314
  - **list_contributions** / **get_contribution**: Browse and read contribution records.
14889
15315
  - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
14890
15316
  - **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:
15317
+ - Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.
15318
+
15319
+ **Sprint Tools:**
15320
+ - **list_sprints** / **get_sprint**: Browse and read sprint definitions.
15321
+ - **create_sprint**: Create sprints with dates, goals, and linked epics. Use status "planned" for upcoming sprints or "active"/"completed"/"cancelled" for current/past sprints.
15322
+ - **update_sprint**: Update sprint status, dates, goal, or linked epics. When linkedEpics changes, affected epics are re-tagged automatically.
15323
+ - **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 %.
15324
+ - Use \`save_report\` with reportType "sprint-progress" to persist sprint reports.
15325
+
15326
+ **Sprint Workflow:**
15327
+ - Create sprints with clear goals and date boundaries.
15328
+ - Assign epics to sprints via linkedEpics.
15329
+ - Tag work items (actions, decisions, questions) with \`sprint:SP-xxx\` for sprint scoping.
15330
+ - Track delivery dates and flag at-risk sprints.
15331
+ - Register past/completed sprints for historical tracking.
15332
+
15333
+ **Sprint Planning:**
15334
+ - When asked to plan or propose a sprint, ALWAYS call **gather_sprint_planning_context** first. It aggregates approved features, backlog epics, active sprint status, velocity from recent sprints, blockers, and summary stats in one call.
15335
+ - Reason through: priority (critical/high features first), capacity (compare backlog effort to velocity reference), dependencies and blockers, balance across features, and risk.
15336
+ - Present a structured sprint proposal: title, goal, suggested dates, selected epics with rationale for each, excluded epics with reason, and identified risks.
15337
+ - After user confirmation, use **create_sprint** with the agreed epics to persist the sprint.`,
15338
+ "*": `You have access to feature, epic, sprint, and meeting tools for project coordination:
14893
15339
 
14894
15340
  **Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
14895
15341
  **Epics** (E-xxx): Implementation work packages created by the Tech Lead, linked to approved features. Epics progress through planned \u2192 in-progress \u2192 done.
15342
+ **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
15343
  **Meetings**: Meeting records with attendees, agendas, and notes.
14897
15344
 
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.
15345
+ **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
15346
 
14900
15347
  - **list_meetings** / **get_meeting**: Browse and read meeting records.
14901
15348
  - **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 +15357,10 @@ var genericAgilePlugin = {
14910
15357
  };
14911
15358
 
14912
15359
  // src/plugins/builtin/tools/use-cases.ts
14913
- import { tool as tool6 } from "@anthropic-ai/claude-agent-sdk";
15360
+ import { tool as tool8 } from "@anthropic-ai/claude-agent-sdk";
14914
15361
  function createUseCaseTools(store) {
14915
15362
  return [
14916
- tool6(
15363
+ tool8(
14917
15364
  "list_use_cases",
14918
15365
  "List all extension use cases, optionally filtered by status or extension type",
14919
15366
  {
@@ -14943,7 +15390,7 @@ function createUseCaseTools(store) {
14943
15390
  },
14944
15391
  { annotations: { readOnly: true } }
14945
15392
  ),
14946
- tool6(
15393
+ tool8(
14947
15394
  "get_use_case",
14948
15395
  "Get the full content of a specific use case by ID",
14949
15396
  { id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
@@ -14970,7 +15417,7 @@ function createUseCaseTools(store) {
14970
15417
  },
14971
15418
  { annotations: { readOnly: true } }
14972
15419
  ),
14973
- tool6(
15420
+ tool8(
14974
15421
  "create_use_case",
14975
15422
  "Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
14976
15423
  {
@@ -15004,7 +15451,7 @@ function createUseCaseTools(store) {
15004
15451
  };
15005
15452
  }
15006
15453
  ),
15007
- tool6(
15454
+ tool8(
15008
15455
  "update_use_case",
15009
15456
  "Update an existing extension use case",
15010
15457
  {
@@ -15034,10 +15481,10 @@ function createUseCaseTools(store) {
15034
15481
  }
15035
15482
 
15036
15483
  // src/plugins/builtin/tools/tech-assessments.ts
15037
- import { tool as tool7 } from "@anthropic-ai/claude-agent-sdk";
15484
+ import { tool as tool9 } from "@anthropic-ai/claude-agent-sdk";
15038
15485
  function createTechAssessmentTools(store) {
15039
15486
  return [
15040
- tool7(
15487
+ tool9(
15041
15488
  "list_tech_assessments",
15042
15489
  "List all technology assessments, optionally filtered by status",
15043
15490
  {
@@ -15068,7 +15515,7 @@ function createTechAssessmentTools(store) {
15068
15515
  },
15069
15516
  { annotations: { readOnly: true } }
15070
15517
  ),
15071
- tool7(
15518
+ tool9(
15072
15519
  "get_tech_assessment",
15073
15520
  "Get the full content of a specific technology assessment by ID",
15074
15521
  { id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
@@ -15095,7 +15542,7 @@ function createTechAssessmentTools(store) {
15095
15542
  },
15096
15543
  { annotations: { readOnly: true } }
15097
15544
  ),
15098
- tool7(
15545
+ tool9(
15099
15546
  "create_tech_assessment",
15100
15547
  "Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
15101
15548
  {
@@ -15166,7 +15613,7 @@ function createTechAssessmentTools(store) {
15166
15613
  };
15167
15614
  }
15168
15615
  ),
15169
- tool7(
15616
+ tool9(
15170
15617
  "update_tech_assessment",
15171
15618
  "Update an existing technology assessment. The linked use case cannot be changed.",
15172
15619
  {
@@ -15196,10 +15643,10 @@ function createTechAssessmentTools(store) {
15196
15643
  }
15197
15644
 
15198
15645
  // src/plugins/builtin/tools/extension-designs.ts
15199
- import { tool as tool8 } from "@anthropic-ai/claude-agent-sdk";
15646
+ import { tool as tool10 } from "@anthropic-ai/claude-agent-sdk";
15200
15647
  function createExtensionDesignTools(store) {
15201
15648
  return [
15202
- tool8(
15649
+ tool10(
15203
15650
  "list_extension_designs",
15204
15651
  "List all extension designs, optionally filtered by status",
15205
15652
  {
@@ -15229,7 +15676,7 @@ function createExtensionDesignTools(store) {
15229
15676
  },
15230
15677
  { annotations: { readOnly: true } }
15231
15678
  ),
15232
- tool8(
15679
+ tool10(
15233
15680
  "get_extension_design",
15234
15681
  "Get the full content of a specific extension design by ID",
15235
15682
  { id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
@@ -15256,7 +15703,7 @@ function createExtensionDesignTools(store) {
15256
15703
  },
15257
15704
  { annotations: { readOnly: true } }
15258
15705
  ),
15259
- tool8(
15706
+ tool10(
15260
15707
  "create_extension_design",
15261
15708
  "Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
15262
15709
  {
@@ -15324,7 +15771,7 @@ function createExtensionDesignTools(store) {
15324
15771
  };
15325
15772
  }
15326
15773
  ),
15327
- tool8(
15774
+ tool10(
15328
15775
  "update_extension_design",
15329
15776
  "Update an existing extension design. The linked tech assessment cannot be changed.",
15330
15777
  {
@@ -15353,10 +15800,10 @@ function createExtensionDesignTools(store) {
15353
15800
  }
15354
15801
 
15355
15802
  // src/plugins/builtin/tools/aem-reports.ts
15356
- import { tool as tool9 } from "@anthropic-ai/claude-agent-sdk";
15803
+ import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
15357
15804
  function createAemReportTools(store) {
15358
15805
  return [
15359
- tool9(
15806
+ tool11(
15360
15807
  "generate_extension_portfolio",
15361
15808
  "Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
15362
15809
  {},
@@ -15408,7 +15855,7 @@ function createAemReportTools(store) {
15408
15855
  },
15409
15856
  { annotations: { readOnly: true } }
15410
15857
  ),
15411
- tool9(
15858
+ tool11(
15412
15859
  "generate_tech_readiness",
15413
15860
  "Generate a BTP technology readiness report showing service coverage and gaps across assessments",
15414
15861
  {},
@@ -15460,7 +15907,7 @@ function createAemReportTools(store) {
15460
15907
  },
15461
15908
  { annotations: { readOnly: true } }
15462
15909
  ),
15463
- tool9(
15910
+ tool11(
15464
15911
  "generate_phase_status",
15465
15912
  "Generate a phase progress report showing artifact counts and readiness per AEM phase",
15466
15913
  {},
@@ -15522,11 +15969,11 @@ function createAemReportTools(store) {
15522
15969
  import * as fs3 from "fs";
15523
15970
  import * as path3 from "path";
15524
15971
  import * as YAML2 from "yaml";
15525
- import { tool as tool10 } from "@anthropic-ai/claude-agent-sdk";
15972
+ import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
15526
15973
  var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
15527
15974
  function createAemPhaseTools(store, marvinDir) {
15528
15975
  return [
15529
- tool10(
15976
+ tool12(
15530
15977
  "get_current_phase",
15531
15978
  "Get the current AEM phase from project configuration",
15532
15979
  {},
@@ -15547,7 +15994,7 @@ function createAemPhaseTools(store, marvinDir) {
15547
15994
  },
15548
15995
  { annotations: { readOnly: true } }
15549
15996
  ),
15550
- tool10(
15997
+ tool12(
15551
15998
  "advance_phase",
15552
15999
  "Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
15553
16000
  {
@@ -15995,9 +16442,10 @@ var deliveryManager = {
15995
16442
  "Team coordination",
15996
16443
  "Process governance",
15997
16444
  "Status tracking",
15998
- "Epic scheduling and tracking"
16445
+ "Epic scheduling and tracking",
16446
+ "Sprint planning and tracking"
15999
16447
  ],
16000
- documentTypes: ["action", "decision", "meeting", "question", "feature", "epic"],
16448
+ documentTypes: ["action", "decision", "meeting", "question", "feature", "epic", "sprint"],
16001
16449
  contributionTypes: ["risk-finding", "blocker-report", "dependency-update", "status-assessment"]
16002
16450
  };
16003
16451
 
@@ -16034,9 +16482,10 @@ var techLead = {
16034
16482
  "Technical decisions",
16035
16483
  "Implementation guidance",
16036
16484
  "Non-functional requirements",
16037
- "Epic creation and scoping"
16485
+ "Epic creation and scoping",
16486
+ "Sprint scoping and technical execution"
16038
16487
  ],
16039
- documentTypes: ["decision", "action", "question", "epic"],
16488
+ documentTypes: ["decision", "action", "question", "epic", "sprint"],
16040
16489
  contributionTypes: ["action-result", "spike-findings", "technical-assessment", "architecture-review"]
16041
16490
  };
16042
16491
 
@@ -16095,6 +16544,7 @@ You have access to governance tools for managing project artifacts:
16095
16544
  - **Questions** (Q-xxx): List, get, create, and update questions
16096
16545
  - **Features** (F-xxx): List, get, create, and update feature definitions
16097
16546
  - **Epics** (E-xxx): List, get, create, and update implementation epics (must link to approved features)
16547
+ - **Sprints** (SP-xxx): List, get, create, and update time-boxed iterations with linked epics and delivery dates
16098
16548
  - **Documents**: Search and read any project document
16099
16549
  - **Sources**: List source documents and view their processing status and derived artifacts
16100
16550
 
@@ -16412,10 +16862,10 @@ import {
16412
16862
  } from "@anthropic-ai/claude-agent-sdk";
16413
16863
 
16414
16864
  // src/agent/tools/decisions.ts
16415
- import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
16865
+ import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
16416
16866
  function createDecisionTools(store) {
16417
16867
  return [
16418
- tool11(
16868
+ tool13(
16419
16869
  "list_decisions",
16420
16870
  "List all decisions in the project, optionally filtered by status",
16421
16871
  { status: external_exports.string().optional().describe("Filter by status (e.g. 'open', 'decided', 'superseded')") },
@@ -16433,7 +16883,7 @@ function createDecisionTools(store) {
16433
16883
  },
16434
16884
  { annotations: { readOnly: true } }
16435
16885
  ),
16436
- tool11(
16886
+ tool13(
16437
16887
  "get_decision",
16438
16888
  "Get the full content of a specific decision by ID",
16439
16889
  { id: external_exports.string().describe("Decision ID (e.g. 'D-001')") },
@@ -16460,7 +16910,7 @@ function createDecisionTools(store) {
16460
16910
  },
16461
16911
  { annotations: { readOnly: true } }
16462
16912
  ),
16463
- tool11(
16913
+ tool13(
16464
16914
  "create_decision",
16465
16915
  "Create a new decision record",
16466
16916
  {
@@ -16491,7 +16941,7 @@ function createDecisionTools(store) {
16491
16941
  };
16492
16942
  }
16493
16943
  ),
16494
- tool11(
16944
+ tool13(
16495
16945
  "update_decision",
16496
16946
  "Update an existing decision",
16497
16947
  {
@@ -16518,10 +16968,10 @@ function createDecisionTools(store) {
16518
16968
  }
16519
16969
 
16520
16970
  // src/agent/tools/actions.ts
16521
- import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
16971
+ import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
16522
16972
  function createActionTools(store) {
16523
16973
  return [
16524
- tool12(
16974
+ tool14(
16525
16975
  "list_actions",
16526
16976
  "List all action items in the project, optionally filtered by status or owner",
16527
16977
  {
@@ -16548,7 +16998,7 @@ function createActionTools(store) {
16548
16998
  },
16549
16999
  { annotations: { readOnly: true } }
16550
17000
  ),
16551
- tool12(
17001
+ tool14(
16552
17002
  "get_action",
16553
17003
  "Get the full content of a specific action item by ID",
16554
17004
  { id: external_exports.string().describe("Action ID (e.g. 'A-001')") },
@@ -16575,7 +17025,7 @@ function createActionTools(store) {
16575
17025
  },
16576
17026
  { annotations: { readOnly: true } }
16577
17027
  ),
16578
- tool12(
17028
+ tool14(
16579
17029
  "create_action",
16580
17030
  "Create a new action item",
16581
17031
  {
@@ -16608,7 +17058,7 @@ function createActionTools(store) {
16608
17058
  };
16609
17059
  }
16610
17060
  ),
16611
- tool12(
17061
+ tool14(
16612
17062
  "update_action",
16613
17063
  "Update an existing action item",
16614
17064
  {
@@ -16636,10 +17086,10 @@ function createActionTools(store) {
16636
17086
  }
16637
17087
 
16638
17088
  // src/agent/tools/questions.ts
16639
- import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
17089
+ import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
16640
17090
  function createQuestionTools(store) {
16641
17091
  return [
16642
- tool13(
17092
+ tool15(
16643
17093
  "list_questions",
16644
17094
  "List all questions in the project, optionally filtered by status",
16645
17095
  {
@@ -16660,7 +17110,7 @@ function createQuestionTools(store) {
16660
17110
  },
16661
17111
  { annotations: { readOnly: true } }
16662
17112
  ),
16663
- tool13(
17113
+ tool15(
16664
17114
  "get_question",
16665
17115
  "Get the full content of a specific question by ID",
16666
17116
  { id: external_exports.string().describe("Question ID (e.g. 'Q-001')") },
@@ -16687,7 +17137,7 @@ function createQuestionTools(store) {
16687
17137
  },
16688
17138
  { annotations: { readOnly: true } }
16689
17139
  ),
16690
- tool13(
17140
+ tool15(
16691
17141
  "create_question",
16692
17142
  "Create a new question that needs to be answered",
16693
17143
  {
@@ -16718,7 +17168,7 @@ function createQuestionTools(store) {
16718
17168
  };
16719
17169
  }
16720
17170
  ),
16721
- tool13(
17171
+ tool15(
16722
17172
  "update_question",
16723
17173
  "Update an existing question",
16724
17174
  {
@@ -16745,10 +17195,10 @@ function createQuestionTools(store) {
16745
17195
  }
16746
17196
 
16747
17197
  // src/agent/tools/documents.ts
16748
- import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
17198
+ import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
16749
17199
  function createDocumentTools(store) {
16750
17200
  return [
16751
- tool14(
17201
+ tool16(
16752
17202
  "search_documents",
16753
17203
  "Search all project documents, optionally filtered by type, status, or tag",
16754
17204
  {
@@ -16780,7 +17230,7 @@ function createDocumentTools(store) {
16780
17230
  },
16781
17231
  { annotations: { readOnly: true } }
16782
17232
  ),
16783
- tool14(
17233
+ tool16(
16784
17234
  "read_document",
16785
17235
  "Read the full content of any project document by ID",
16786
17236
  { id: external_exports.string().describe("Document ID (e.g. 'D-001', 'A-003', 'Q-002')") },
@@ -16807,7 +17257,7 @@ function createDocumentTools(store) {
16807
17257
  },
16808
17258
  { annotations: { readOnly: true } }
16809
17259
  ),
16810
- tool14(
17260
+ tool16(
16811
17261
  "project_summary",
16812
17262
  "Get a summary of all project documents and their counts",
16813
17263
  {},
@@ -16839,10 +17289,10 @@ function createDocumentTools(store) {
16839
17289
  }
16840
17290
 
16841
17291
  // src/agent/tools/sources.ts
16842
- import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
17292
+ import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
16843
17293
  function createSourceTools(manifest) {
16844
17294
  return [
16845
- tool15(
17295
+ tool17(
16846
17296
  "list_sources",
16847
17297
  "List all source documents and their processing status",
16848
17298
  {
@@ -16872,7 +17322,7 @@ function createSourceTools(manifest) {
16872
17322
  },
16873
17323
  { annotations: { readOnly: true } }
16874
17324
  ),
16875
- tool15(
17325
+ tool17(
16876
17326
  "get_source_info",
16877
17327
  "Get detailed information about a specific source document",
16878
17328
  {
@@ -16910,10 +17360,10 @@ function createSourceTools(manifest) {
16910
17360
  }
16911
17361
 
16912
17362
  // src/agent/tools/sessions.ts
16913
- import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
17363
+ import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
16914
17364
  function createSessionTools(store) {
16915
17365
  return [
16916
- tool16(
17366
+ tool18(
16917
17367
  "list_sessions",
16918
17368
  "List all saved chat sessions, sorted by most recently used",
16919
17369
  {
@@ -16937,7 +17387,7 @@ function createSessionTools(store) {
16937
17387
  },
16938
17388
  { annotations: { readOnly: true } }
16939
17389
  ),
16940
- tool16(
17390
+ tool18(
16941
17391
  "get_session",
16942
17392
  "Get details of a specific saved session by name",
16943
17393
  { name: external_exports.string().describe("Session name (e.g. 'jwt-auth-decision')") },
@@ -18526,7 +18976,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18526
18976
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
18527
18977
 
18528
18978
  // src/skills/action-tools.ts
18529
- import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
18979
+ import { tool as tool19 } from "@anthropic-ai/claude-agent-sdk";
18530
18980
 
18531
18981
  // src/skills/action-runner.ts
18532
18982
  import { query as query4 } from "@anthropic-ai/claude-agent-sdk";
@@ -18592,7 +19042,7 @@ function createSkillActionTools(skills, context) {
18592
19042
  if (!skill.actions) continue;
18593
19043
  for (const action of skill.actions) {
18594
19044
  tools.push(
18595
- tool17(
19045
+ tool19(
18596
19046
  `${skill.id}__${action.id}`,
18597
19047
  action.description,
18598
19048
  {
@@ -18684,10 +19134,10 @@ ${lines.join("\n\n")}`;
18684
19134
  }
18685
19135
 
18686
19136
  // src/mcp/persona-tools.ts
18687
- import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
19137
+ import { tool as tool20 } from "@anthropic-ai/claude-agent-sdk";
18688
19138
  function createPersonaTools(ctx, marvinDir) {
18689
19139
  return [
18690
- tool18(
19140
+ tool20(
18691
19141
  "set_persona",
18692
19142
  "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
19143
  {
@@ -18717,7 +19167,7 @@ ${summaries}`
18717
19167
  };
18718
19168
  }
18719
19169
  ),
18720
- tool18(
19170
+ tool20(
18721
19171
  "get_persona_guidance",
18722
19172
  "Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
18723
19173
  {
@@ -19332,7 +19782,8 @@ function getDirNameForType(store, type) {
19332
19782
  meeting: "meetings",
19333
19783
  report: "reports",
19334
19784
  feature: "features",
19335
- epic: "epics"
19785
+ epic: "epics",
19786
+ sprint: "sprints"
19336
19787
  };
19337
19788
  return typeDir[type] ?? `${type}s`;
19338
19789
  }
@@ -20239,7 +20690,7 @@ function createProgram() {
20239
20690
  const program2 = new Command();
20240
20691
  program2.name("marvin").description(
20241
20692
  "AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
20242
- ).version("0.2.4");
20693
+ ).version("0.2.6");
20243
20694
  program2.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
20244
20695
  await initCommand();
20245
20696
  });