mrvn-cli 0.2.5 → 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/README.md +14 -1
- package/dist/index.js +225 -31
- package/dist/index.js.map +1 -1
- package/dist/marvin-serve.js +224 -30
- package/dist/marvin-serve.js.map +1 -1
- package/dist/marvin.js +250 -56
- package/dist/marvin.js.map +1 -1
- package/package.json +1 -1
package/dist/marvin.js
CHANGED
|
@@ -15003,6 +15003,188 @@ function createSprintTools(store) {
|
|
|
15003
15003
|
];
|
|
15004
15004
|
}
|
|
15005
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
|
+
|
|
15006
15188
|
// src/plugins/common.ts
|
|
15007
15189
|
var COMMON_REGISTRATIONS = [
|
|
15008
15190
|
{ type: "meeting", dirName: "meetings", idPrefix: "M" },
|
|
@@ -15019,7 +15201,8 @@ function createCommonTools(store) {
|
|
|
15019
15201
|
...createFeatureTools(store),
|
|
15020
15202
|
...createEpicTools(store),
|
|
15021
15203
|
...createContributionTools(store),
|
|
15022
|
-
...createSprintTools(store)
|
|
15204
|
+
...createSprintTools(store),
|
|
15205
|
+
...createSprintPlanningTools(store)
|
|
15023
15206
|
];
|
|
15024
15207
|
}
|
|
15025
15208
|
|
|
@@ -15092,7 +15275,12 @@ var genericAgilePlugin = {
|
|
|
15092
15275
|
- **list_sprints** / **get_sprint**: View sprints to understand iteration scope and delivery dates.
|
|
15093
15276
|
- **update_sprint**: Assign epics to sprints by updating linkedEpics when breaking features into work.
|
|
15094
15277
|
- 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
|
|
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.`,
|
|
15096
15284
|
"delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
|
|
15097
15285
|
|
|
15098
15286
|
**Report Tools:**
|
|
@@ -15140,7 +15328,13 @@ var genericAgilePlugin = {
|
|
|
15140
15328
|
- Assign epics to sprints via linkedEpics.
|
|
15141
15329
|
- Tag work items (actions, decisions, questions) with \`sprint:SP-xxx\` for sprint scoping.
|
|
15142
15330
|
- Track delivery dates and flag at-risk sprints.
|
|
15143
|
-
- Register past/completed sprints for historical tracking
|
|
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.`,
|
|
15144
15338
|
"*": `You have access to feature, epic, sprint, and meeting tools for project coordination:
|
|
15145
15339
|
|
|
15146
15340
|
**Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
|
|
@@ -15163,10 +15357,10 @@ var genericAgilePlugin = {
|
|
|
15163
15357
|
};
|
|
15164
15358
|
|
|
15165
15359
|
// src/plugins/builtin/tools/use-cases.ts
|
|
15166
|
-
import { tool as
|
|
15360
|
+
import { tool as tool8 } from "@anthropic-ai/claude-agent-sdk";
|
|
15167
15361
|
function createUseCaseTools(store) {
|
|
15168
15362
|
return [
|
|
15169
|
-
|
|
15363
|
+
tool8(
|
|
15170
15364
|
"list_use_cases",
|
|
15171
15365
|
"List all extension use cases, optionally filtered by status or extension type",
|
|
15172
15366
|
{
|
|
@@ -15196,7 +15390,7 @@ function createUseCaseTools(store) {
|
|
|
15196
15390
|
},
|
|
15197
15391
|
{ annotations: { readOnly: true } }
|
|
15198
15392
|
),
|
|
15199
|
-
|
|
15393
|
+
tool8(
|
|
15200
15394
|
"get_use_case",
|
|
15201
15395
|
"Get the full content of a specific use case by ID",
|
|
15202
15396
|
{ id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
|
|
@@ -15223,7 +15417,7 @@ function createUseCaseTools(store) {
|
|
|
15223
15417
|
},
|
|
15224
15418
|
{ annotations: { readOnly: true } }
|
|
15225
15419
|
),
|
|
15226
|
-
|
|
15420
|
+
tool8(
|
|
15227
15421
|
"create_use_case",
|
|
15228
15422
|
"Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
|
|
15229
15423
|
{
|
|
@@ -15257,7 +15451,7 @@ function createUseCaseTools(store) {
|
|
|
15257
15451
|
};
|
|
15258
15452
|
}
|
|
15259
15453
|
),
|
|
15260
|
-
|
|
15454
|
+
tool8(
|
|
15261
15455
|
"update_use_case",
|
|
15262
15456
|
"Update an existing extension use case",
|
|
15263
15457
|
{
|
|
@@ -15287,10 +15481,10 @@ function createUseCaseTools(store) {
|
|
|
15287
15481
|
}
|
|
15288
15482
|
|
|
15289
15483
|
// src/plugins/builtin/tools/tech-assessments.ts
|
|
15290
|
-
import { tool as
|
|
15484
|
+
import { tool as tool9 } from "@anthropic-ai/claude-agent-sdk";
|
|
15291
15485
|
function createTechAssessmentTools(store) {
|
|
15292
15486
|
return [
|
|
15293
|
-
|
|
15487
|
+
tool9(
|
|
15294
15488
|
"list_tech_assessments",
|
|
15295
15489
|
"List all technology assessments, optionally filtered by status",
|
|
15296
15490
|
{
|
|
@@ -15321,7 +15515,7 @@ function createTechAssessmentTools(store) {
|
|
|
15321
15515
|
},
|
|
15322
15516
|
{ annotations: { readOnly: true } }
|
|
15323
15517
|
),
|
|
15324
|
-
|
|
15518
|
+
tool9(
|
|
15325
15519
|
"get_tech_assessment",
|
|
15326
15520
|
"Get the full content of a specific technology assessment by ID",
|
|
15327
15521
|
{ id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
|
|
@@ -15348,7 +15542,7 @@ function createTechAssessmentTools(store) {
|
|
|
15348
15542
|
},
|
|
15349
15543
|
{ annotations: { readOnly: true } }
|
|
15350
15544
|
),
|
|
15351
|
-
|
|
15545
|
+
tool9(
|
|
15352
15546
|
"create_tech_assessment",
|
|
15353
15547
|
"Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
|
|
15354
15548
|
{
|
|
@@ -15419,7 +15613,7 @@ function createTechAssessmentTools(store) {
|
|
|
15419
15613
|
};
|
|
15420
15614
|
}
|
|
15421
15615
|
),
|
|
15422
|
-
|
|
15616
|
+
tool9(
|
|
15423
15617
|
"update_tech_assessment",
|
|
15424
15618
|
"Update an existing technology assessment. The linked use case cannot be changed.",
|
|
15425
15619
|
{
|
|
@@ -15449,10 +15643,10 @@ function createTechAssessmentTools(store) {
|
|
|
15449
15643
|
}
|
|
15450
15644
|
|
|
15451
15645
|
// src/plugins/builtin/tools/extension-designs.ts
|
|
15452
|
-
import { tool as
|
|
15646
|
+
import { tool as tool10 } from "@anthropic-ai/claude-agent-sdk";
|
|
15453
15647
|
function createExtensionDesignTools(store) {
|
|
15454
15648
|
return [
|
|
15455
|
-
|
|
15649
|
+
tool10(
|
|
15456
15650
|
"list_extension_designs",
|
|
15457
15651
|
"List all extension designs, optionally filtered by status",
|
|
15458
15652
|
{
|
|
@@ -15482,7 +15676,7 @@ function createExtensionDesignTools(store) {
|
|
|
15482
15676
|
},
|
|
15483
15677
|
{ annotations: { readOnly: true } }
|
|
15484
15678
|
),
|
|
15485
|
-
|
|
15679
|
+
tool10(
|
|
15486
15680
|
"get_extension_design",
|
|
15487
15681
|
"Get the full content of a specific extension design by ID",
|
|
15488
15682
|
{ id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
|
|
@@ -15509,7 +15703,7 @@ function createExtensionDesignTools(store) {
|
|
|
15509
15703
|
},
|
|
15510
15704
|
{ annotations: { readOnly: true } }
|
|
15511
15705
|
),
|
|
15512
|
-
|
|
15706
|
+
tool10(
|
|
15513
15707
|
"create_extension_design",
|
|
15514
15708
|
"Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
|
|
15515
15709
|
{
|
|
@@ -15577,7 +15771,7 @@ function createExtensionDesignTools(store) {
|
|
|
15577
15771
|
};
|
|
15578
15772
|
}
|
|
15579
15773
|
),
|
|
15580
|
-
|
|
15774
|
+
tool10(
|
|
15581
15775
|
"update_extension_design",
|
|
15582
15776
|
"Update an existing extension design. The linked tech assessment cannot be changed.",
|
|
15583
15777
|
{
|
|
@@ -15606,10 +15800,10 @@ function createExtensionDesignTools(store) {
|
|
|
15606
15800
|
}
|
|
15607
15801
|
|
|
15608
15802
|
// src/plugins/builtin/tools/aem-reports.ts
|
|
15609
|
-
import { tool as
|
|
15803
|
+
import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
|
|
15610
15804
|
function createAemReportTools(store) {
|
|
15611
15805
|
return [
|
|
15612
|
-
|
|
15806
|
+
tool11(
|
|
15613
15807
|
"generate_extension_portfolio",
|
|
15614
15808
|
"Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
|
|
15615
15809
|
{},
|
|
@@ -15661,7 +15855,7 @@ function createAemReportTools(store) {
|
|
|
15661
15855
|
},
|
|
15662
15856
|
{ annotations: { readOnly: true } }
|
|
15663
15857
|
),
|
|
15664
|
-
|
|
15858
|
+
tool11(
|
|
15665
15859
|
"generate_tech_readiness",
|
|
15666
15860
|
"Generate a BTP technology readiness report showing service coverage and gaps across assessments",
|
|
15667
15861
|
{},
|
|
@@ -15713,7 +15907,7 @@ function createAemReportTools(store) {
|
|
|
15713
15907
|
},
|
|
15714
15908
|
{ annotations: { readOnly: true } }
|
|
15715
15909
|
),
|
|
15716
|
-
|
|
15910
|
+
tool11(
|
|
15717
15911
|
"generate_phase_status",
|
|
15718
15912
|
"Generate a phase progress report showing artifact counts and readiness per AEM phase",
|
|
15719
15913
|
{},
|
|
@@ -15775,11 +15969,11 @@ function createAemReportTools(store) {
|
|
|
15775
15969
|
import * as fs3 from "fs";
|
|
15776
15970
|
import * as path3 from "path";
|
|
15777
15971
|
import * as YAML2 from "yaml";
|
|
15778
|
-
import { tool as
|
|
15972
|
+
import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
|
|
15779
15973
|
var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
|
|
15780
15974
|
function createAemPhaseTools(store, marvinDir) {
|
|
15781
15975
|
return [
|
|
15782
|
-
|
|
15976
|
+
tool12(
|
|
15783
15977
|
"get_current_phase",
|
|
15784
15978
|
"Get the current AEM phase from project configuration",
|
|
15785
15979
|
{},
|
|
@@ -15800,7 +15994,7 @@ function createAemPhaseTools(store, marvinDir) {
|
|
|
15800
15994
|
},
|
|
15801
15995
|
{ annotations: { readOnly: true } }
|
|
15802
15996
|
),
|
|
15803
|
-
|
|
15997
|
+
tool12(
|
|
15804
15998
|
"advance_phase",
|
|
15805
15999
|
"Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
|
|
15806
16000
|
{
|
|
@@ -16668,10 +16862,10 @@ import {
|
|
|
16668
16862
|
} from "@anthropic-ai/claude-agent-sdk";
|
|
16669
16863
|
|
|
16670
16864
|
// src/agent/tools/decisions.ts
|
|
16671
|
-
import { tool as
|
|
16865
|
+
import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
|
|
16672
16866
|
function createDecisionTools(store) {
|
|
16673
16867
|
return [
|
|
16674
|
-
|
|
16868
|
+
tool13(
|
|
16675
16869
|
"list_decisions",
|
|
16676
16870
|
"List all decisions in the project, optionally filtered by status",
|
|
16677
16871
|
{ status: external_exports.string().optional().describe("Filter by status (e.g. 'open', 'decided', 'superseded')") },
|
|
@@ -16689,7 +16883,7 @@ function createDecisionTools(store) {
|
|
|
16689
16883
|
},
|
|
16690
16884
|
{ annotations: { readOnly: true } }
|
|
16691
16885
|
),
|
|
16692
|
-
|
|
16886
|
+
tool13(
|
|
16693
16887
|
"get_decision",
|
|
16694
16888
|
"Get the full content of a specific decision by ID",
|
|
16695
16889
|
{ id: external_exports.string().describe("Decision ID (e.g. 'D-001')") },
|
|
@@ -16716,7 +16910,7 @@ function createDecisionTools(store) {
|
|
|
16716
16910
|
},
|
|
16717
16911
|
{ annotations: { readOnly: true } }
|
|
16718
16912
|
),
|
|
16719
|
-
|
|
16913
|
+
tool13(
|
|
16720
16914
|
"create_decision",
|
|
16721
16915
|
"Create a new decision record",
|
|
16722
16916
|
{
|
|
@@ -16747,7 +16941,7 @@ function createDecisionTools(store) {
|
|
|
16747
16941
|
};
|
|
16748
16942
|
}
|
|
16749
16943
|
),
|
|
16750
|
-
|
|
16944
|
+
tool13(
|
|
16751
16945
|
"update_decision",
|
|
16752
16946
|
"Update an existing decision",
|
|
16753
16947
|
{
|
|
@@ -16774,10 +16968,10 @@ function createDecisionTools(store) {
|
|
|
16774
16968
|
}
|
|
16775
16969
|
|
|
16776
16970
|
// src/agent/tools/actions.ts
|
|
16777
|
-
import { tool as
|
|
16971
|
+
import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
|
|
16778
16972
|
function createActionTools(store) {
|
|
16779
16973
|
return [
|
|
16780
|
-
|
|
16974
|
+
tool14(
|
|
16781
16975
|
"list_actions",
|
|
16782
16976
|
"List all action items in the project, optionally filtered by status or owner",
|
|
16783
16977
|
{
|
|
@@ -16804,7 +16998,7 @@ function createActionTools(store) {
|
|
|
16804
16998
|
},
|
|
16805
16999
|
{ annotations: { readOnly: true } }
|
|
16806
17000
|
),
|
|
16807
|
-
|
|
17001
|
+
tool14(
|
|
16808
17002
|
"get_action",
|
|
16809
17003
|
"Get the full content of a specific action item by ID",
|
|
16810
17004
|
{ id: external_exports.string().describe("Action ID (e.g. 'A-001')") },
|
|
@@ -16831,7 +17025,7 @@ function createActionTools(store) {
|
|
|
16831
17025
|
},
|
|
16832
17026
|
{ annotations: { readOnly: true } }
|
|
16833
17027
|
),
|
|
16834
|
-
|
|
17028
|
+
tool14(
|
|
16835
17029
|
"create_action",
|
|
16836
17030
|
"Create a new action item",
|
|
16837
17031
|
{
|
|
@@ -16864,7 +17058,7 @@ function createActionTools(store) {
|
|
|
16864
17058
|
};
|
|
16865
17059
|
}
|
|
16866
17060
|
),
|
|
16867
|
-
|
|
17061
|
+
tool14(
|
|
16868
17062
|
"update_action",
|
|
16869
17063
|
"Update an existing action item",
|
|
16870
17064
|
{
|
|
@@ -16892,10 +17086,10 @@ function createActionTools(store) {
|
|
|
16892
17086
|
}
|
|
16893
17087
|
|
|
16894
17088
|
// src/agent/tools/questions.ts
|
|
16895
|
-
import { tool as
|
|
17089
|
+
import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
|
|
16896
17090
|
function createQuestionTools(store) {
|
|
16897
17091
|
return [
|
|
16898
|
-
|
|
17092
|
+
tool15(
|
|
16899
17093
|
"list_questions",
|
|
16900
17094
|
"List all questions in the project, optionally filtered by status",
|
|
16901
17095
|
{
|
|
@@ -16916,7 +17110,7 @@ function createQuestionTools(store) {
|
|
|
16916
17110
|
},
|
|
16917
17111
|
{ annotations: { readOnly: true } }
|
|
16918
17112
|
),
|
|
16919
|
-
|
|
17113
|
+
tool15(
|
|
16920
17114
|
"get_question",
|
|
16921
17115
|
"Get the full content of a specific question by ID",
|
|
16922
17116
|
{ id: external_exports.string().describe("Question ID (e.g. 'Q-001')") },
|
|
@@ -16943,7 +17137,7 @@ function createQuestionTools(store) {
|
|
|
16943
17137
|
},
|
|
16944
17138
|
{ annotations: { readOnly: true } }
|
|
16945
17139
|
),
|
|
16946
|
-
|
|
17140
|
+
tool15(
|
|
16947
17141
|
"create_question",
|
|
16948
17142
|
"Create a new question that needs to be answered",
|
|
16949
17143
|
{
|
|
@@ -16974,7 +17168,7 @@ function createQuestionTools(store) {
|
|
|
16974
17168
|
};
|
|
16975
17169
|
}
|
|
16976
17170
|
),
|
|
16977
|
-
|
|
17171
|
+
tool15(
|
|
16978
17172
|
"update_question",
|
|
16979
17173
|
"Update an existing question",
|
|
16980
17174
|
{
|
|
@@ -17001,10 +17195,10 @@ function createQuestionTools(store) {
|
|
|
17001
17195
|
}
|
|
17002
17196
|
|
|
17003
17197
|
// src/agent/tools/documents.ts
|
|
17004
|
-
import { tool as
|
|
17198
|
+
import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
|
|
17005
17199
|
function createDocumentTools(store) {
|
|
17006
17200
|
return [
|
|
17007
|
-
|
|
17201
|
+
tool16(
|
|
17008
17202
|
"search_documents",
|
|
17009
17203
|
"Search all project documents, optionally filtered by type, status, or tag",
|
|
17010
17204
|
{
|
|
@@ -17036,7 +17230,7 @@ function createDocumentTools(store) {
|
|
|
17036
17230
|
},
|
|
17037
17231
|
{ annotations: { readOnly: true } }
|
|
17038
17232
|
),
|
|
17039
|
-
|
|
17233
|
+
tool16(
|
|
17040
17234
|
"read_document",
|
|
17041
17235
|
"Read the full content of any project document by ID",
|
|
17042
17236
|
{ id: external_exports.string().describe("Document ID (e.g. 'D-001', 'A-003', 'Q-002')") },
|
|
@@ -17063,7 +17257,7 @@ function createDocumentTools(store) {
|
|
|
17063
17257
|
},
|
|
17064
17258
|
{ annotations: { readOnly: true } }
|
|
17065
17259
|
),
|
|
17066
|
-
|
|
17260
|
+
tool16(
|
|
17067
17261
|
"project_summary",
|
|
17068
17262
|
"Get a summary of all project documents and their counts",
|
|
17069
17263
|
{},
|
|
@@ -17095,10 +17289,10 @@ function createDocumentTools(store) {
|
|
|
17095
17289
|
}
|
|
17096
17290
|
|
|
17097
17291
|
// src/agent/tools/sources.ts
|
|
17098
|
-
import { tool as
|
|
17292
|
+
import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
|
|
17099
17293
|
function createSourceTools(manifest) {
|
|
17100
17294
|
return [
|
|
17101
|
-
|
|
17295
|
+
tool17(
|
|
17102
17296
|
"list_sources",
|
|
17103
17297
|
"List all source documents and their processing status",
|
|
17104
17298
|
{
|
|
@@ -17128,7 +17322,7 @@ function createSourceTools(manifest) {
|
|
|
17128
17322
|
},
|
|
17129
17323
|
{ annotations: { readOnly: true } }
|
|
17130
17324
|
),
|
|
17131
|
-
|
|
17325
|
+
tool17(
|
|
17132
17326
|
"get_source_info",
|
|
17133
17327
|
"Get detailed information about a specific source document",
|
|
17134
17328
|
{
|
|
@@ -17166,10 +17360,10 @@ function createSourceTools(manifest) {
|
|
|
17166
17360
|
}
|
|
17167
17361
|
|
|
17168
17362
|
// src/agent/tools/sessions.ts
|
|
17169
|
-
import { tool as
|
|
17363
|
+
import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
|
|
17170
17364
|
function createSessionTools(store) {
|
|
17171
17365
|
return [
|
|
17172
|
-
|
|
17366
|
+
tool18(
|
|
17173
17367
|
"list_sessions",
|
|
17174
17368
|
"List all saved chat sessions, sorted by most recently used",
|
|
17175
17369
|
{
|
|
@@ -17193,7 +17387,7 @@ function createSessionTools(store) {
|
|
|
17193
17387
|
},
|
|
17194
17388
|
{ annotations: { readOnly: true } }
|
|
17195
17389
|
),
|
|
17196
|
-
|
|
17390
|
+
tool18(
|
|
17197
17391
|
"get_session",
|
|
17198
17392
|
"Get details of a specific saved session by name",
|
|
17199
17393
|
{ name: external_exports.string().describe("Session name (e.g. 'jwt-auth-decision')") },
|
|
@@ -18782,7 +18976,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
18782
18976
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
18783
18977
|
|
|
18784
18978
|
// src/skills/action-tools.ts
|
|
18785
|
-
import { tool as
|
|
18979
|
+
import { tool as tool19 } from "@anthropic-ai/claude-agent-sdk";
|
|
18786
18980
|
|
|
18787
18981
|
// src/skills/action-runner.ts
|
|
18788
18982
|
import { query as query4 } from "@anthropic-ai/claude-agent-sdk";
|
|
@@ -18848,7 +19042,7 @@ function createSkillActionTools(skills, context) {
|
|
|
18848
19042
|
if (!skill.actions) continue;
|
|
18849
19043
|
for (const action of skill.actions) {
|
|
18850
19044
|
tools.push(
|
|
18851
|
-
|
|
19045
|
+
tool19(
|
|
18852
19046
|
`${skill.id}__${action.id}`,
|
|
18853
19047
|
action.description,
|
|
18854
19048
|
{
|
|
@@ -18940,10 +19134,10 @@ ${lines.join("\n\n")}`;
|
|
|
18940
19134
|
}
|
|
18941
19135
|
|
|
18942
19136
|
// src/mcp/persona-tools.ts
|
|
18943
|
-
import { tool as
|
|
19137
|
+
import { tool as tool20 } from "@anthropic-ai/claude-agent-sdk";
|
|
18944
19138
|
function createPersonaTools(ctx, marvinDir) {
|
|
18945
19139
|
return [
|
|
18946
|
-
|
|
19140
|
+
tool20(
|
|
18947
19141
|
"set_persona",
|
|
18948
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.",
|
|
18949
19143
|
{
|
|
@@ -18973,7 +19167,7 @@ ${summaries}`
|
|
|
18973
19167
|
};
|
|
18974
19168
|
}
|
|
18975
19169
|
),
|
|
18976
|
-
|
|
19170
|
+
tool20(
|
|
18977
19171
|
"get_persona_guidance",
|
|
18978
19172
|
"Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
|
|
18979
19173
|
{
|
|
@@ -20496,7 +20690,7 @@ function createProgram() {
|
|
|
20496
20690
|
const program2 = new Command();
|
|
20497
20691
|
program2.name("marvin").description(
|
|
20498
20692
|
"AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
|
|
20499
|
-
).version("0.2.
|
|
20693
|
+
).version("0.2.6");
|
|
20500
20694
|
program2.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
|
|
20501
20695
|
await initCommand();
|
|
20502
20696
|
});
|