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-serve.js
CHANGED
|
@@ -15873,6 +15873,188 @@ function createSprintTools(store) {
|
|
|
15873
15873
|
];
|
|
15874
15874
|
}
|
|
15875
15875
|
|
|
15876
|
+
// src/plugins/builtin/tools/sprint-planning.ts
|
|
15877
|
+
import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
|
|
15878
|
+
var PRIORITY_ORDER = {
|
|
15879
|
+
critical: 0,
|
|
15880
|
+
high: 1,
|
|
15881
|
+
medium: 2,
|
|
15882
|
+
low: 3
|
|
15883
|
+
};
|
|
15884
|
+
function priorityRank(p) {
|
|
15885
|
+
return PRIORITY_ORDER[p ?? ""] ?? 99;
|
|
15886
|
+
}
|
|
15887
|
+
function createSprintPlanningTools(store) {
|
|
15888
|
+
return [
|
|
15889
|
+
tool13(
|
|
15890
|
+
"gather_sprint_planning_context",
|
|
15891
|
+
"Aggregate all planning-relevant data for proposing the next sprint: approved features, backlog epics, active sprint, velocity reference, blockers, and summary stats",
|
|
15892
|
+
{
|
|
15893
|
+
focusFeature: external_exports.string().optional().describe("Filter backlog to epics of a specific feature ID (e.g. 'F-001')"),
|
|
15894
|
+
sprintDurationDays: external_exports.number().optional().describe("Expected sprint duration in days \u2014 passed through for capacity reasoning")
|
|
15895
|
+
},
|
|
15896
|
+
async (args) => {
|
|
15897
|
+
const features = store.list({ type: "feature" });
|
|
15898
|
+
const epics = store.list({ type: "epic" });
|
|
15899
|
+
const sprints = store.list({ type: "sprint" });
|
|
15900
|
+
const questions = store.list({ type: "question", status: "open" });
|
|
15901
|
+
const contributions = store.list({ type: "contribution" });
|
|
15902
|
+
const approvedFeatures = features.filter((f) => f.frontmatter.status === "approved").sort((a, b) => priorityRank(a.frontmatter.priority) - priorityRank(b.frontmatter.priority)).map((f) => {
|
|
15903
|
+
const linkedEpics = epics.filter((e) => e.frontmatter.linkedFeature === f.frontmatter.id);
|
|
15904
|
+
const epicsByStatus = {};
|
|
15905
|
+
for (const e of linkedEpics) {
|
|
15906
|
+
epicsByStatus[e.frontmatter.status] = (epicsByStatus[e.frontmatter.status] ?? 0) + 1;
|
|
15907
|
+
}
|
|
15908
|
+
return {
|
|
15909
|
+
id: f.frontmatter.id,
|
|
15910
|
+
title: f.frontmatter.title,
|
|
15911
|
+
priority: f.frontmatter.priority,
|
|
15912
|
+
owner: f.frontmatter.owner,
|
|
15913
|
+
epicCount: linkedEpics.length,
|
|
15914
|
+
epicsByStatus
|
|
15915
|
+
};
|
|
15916
|
+
});
|
|
15917
|
+
const assignedEpicIds = /* @__PURE__ */ new Set();
|
|
15918
|
+
for (const sp of sprints) {
|
|
15919
|
+
const linked = sp.frontmatter.linkedEpics ?? [];
|
|
15920
|
+
for (const id of linked) assignedEpicIds.add(id);
|
|
15921
|
+
}
|
|
15922
|
+
const featureMap = new Map(features.map((f) => [f.frontmatter.id, f]));
|
|
15923
|
+
let backlogEpics = epics.filter(
|
|
15924
|
+
(e) => !assignedEpicIds.has(e.frontmatter.id) && e.frontmatter.status !== "done"
|
|
15925
|
+
);
|
|
15926
|
+
if (args.focusFeature) {
|
|
15927
|
+
backlogEpics = backlogEpics.filter(
|
|
15928
|
+
(e) => e.frontmatter.linkedFeature === args.focusFeature
|
|
15929
|
+
);
|
|
15930
|
+
}
|
|
15931
|
+
const backlog = backlogEpics.sort((a, b) => {
|
|
15932
|
+
const fa = featureMap.get(a.frontmatter.linkedFeature);
|
|
15933
|
+
const fb = featureMap.get(b.frontmatter.linkedFeature);
|
|
15934
|
+
return priorityRank(fa?.frontmatter.priority) - priorityRank(fb?.frontmatter.priority);
|
|
15935
|
+
}).map((e) => {
|
|
15936
|
+
const parent = featureMap.get(e.frontmatter.linkedFeature);
|
|
15937
|
+
return {
|
|
15938
|
+
id: e.frontmatter.id,
|
|
15939
|
+
title: e.frontmatter.title,
|
|
15940
|
+
status: e.frontmatter.status,
|
|
15941
|
+
linkedFeature: e.frontmatter.linkedFeature,
|
|
15942
|
+
featureTitle: parent?.frontmatter.title ?? null,
|
|
15943
|
+
featurePriority: parent?.frontmatter.priority ?? null,
|
|
15944
|
+
estimatedEffort: e.frontmatter.estimatedEffort ?? null,
|
|
15945
|
+
targetDate: e.frontmatter.targetDate ?? null
|
|
15946
|
+
};
|
|
15947
|
+
});
|
|
15948
|
+
const activeSprintDoc = sprints.find((s) => s.frontmatter.status === "active") ?? null;
|
|
15949
|
+
let activeSprint = null;
|
|
15950
|
+
if (activeSprintDoc) {
|
|
15951
|
+
const linkedEpicIds = activeSprintDoc.frontmatter.linkedEpics ?? [];
|
|
15952
|
+
const linkedEpics = linkedEpicIds.map((epicId) => {
|
|
15953
|
+
const epic = store.get(epicId);
|
|
15954
|
+
return epic ? { id: epicId, title: epic.frontmatter.title, status: epic.frontmatter.status } : { id: epicId, title: "(not found)", status: "unknown" };
|
|
15955
|
+
});
|
|
15956
|
+
const allDocs = store.list();
|
|
15957
|
+
const sprintTag = `sprint:${activeSprintDoc.frontmatter.id}`;
|
|
15958
|
+
const workItems = allDocs.filter(
|
|
15959
|
+
(d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(sprintTag)
|
|
15960
|
+
);
|
|
15961
|
+
const doneCount = workItems.filter(
|
|
15962
|
+
(d) => d.frontmatter.status === "done" || d.frontmatter.status === "resolved" || d.frontmatter.status === "closed"
|
|
15963
|
+
).length;
|
|
15964
|
+
const completionPct = workItems.length > 0 ? Math.round(doneCount / workItems.length * 100) : 0;
|
|
15965
|
+
activeSprint = {
|
|
15966
|
+
id: activeSprintDoc.frontmatter.id,
|
|
15967
|
+
title: activeSprintDoc.frontmatter.title,
|
|
15968
|
+
goal: activeSprintDoc.frontmatter.goal,
|
|
15969
|
+
startDate: activeSprintDoc.frontmatter.startDate,
|
|
15970
|
+
endDate: activeSprintDoc.frontmatter.endDate,
|
|
15971
|
+
linkedEpics,
|
|
15972
|
+
workItems: { total: workItems.length, done: doneCount, completionPct }
|
|
15973
|
+
};
|
|
15974
|
+
}
|
|
15975
|
+
const completedSprints = sprints.filter((s) => s.frontmatter.status === "completed").sort((a, b) => {
|
|
15976
|
+
const da = a.frontmatter.endDate ?? "";
|
|
15977
|
+
const db = b.frontmatter.endDate ?? "";
|
|
15978
|
+
return da < db ? 1 : da > db ? -1 : 0;
|
|
15979
|
+
}).slice(0, 2);
|
|
15980
|
+
const velocityReference = completedSprints.map((sp) => {
|
|
15981
|
+
const linkedEpicIds = sp.frontmatter.linkedEpics ?? [];
|
|
15982
|
+
const efforts = [];
|
|
15983
|
+
for (const epicId of linkedEpicIds) {
|
|
15984
|
+
const epic = store.get(epicId);
|
|
15985
|
+
if (epic?.frontmatter.estimatedEffort) {
|
|
15986
|
+
efforts.push(String(epic.frontmatter.estimatedEffort));
|
|
15987
|
+
}
|
|
15988
|
+
}
|
|
15989
|
+
const allDocs = store.list();
|
|
15990
|
+
const sprintTag = `sprint:${sp.frontmatter.id}`;
|
|
15991
|
+
const workItems = allDocs.filter(
|
|
15992
|
+
(d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(sprintTag)
|
|
15993
|
+
);
|
|
15994
|
+
return {
|
|
15995
|
+
id: sp.frontmatter.id,
|
|
15996
|
+
title: sp.frontmatter.title,
|
|
15997
|
+
startDate: sp.frontmatter.startDate,
|
|
15998
|
+
endDate: sp.frontmatter.endDate,
|
|
15999
|
+
epicCount: linkedEpicIds.length,
|
|
16000
|
+
efforts,
|
|
16001
|
+
workItemCount: workItems.length
|
|
16002
|
+
};
|
|
16003
|
+
});
|
|
16004
|
+
const openBlockerContributions = contributions.filter(
|
|
16005
|
+
(c) => c.frontmatter.status === "open" && (c.frontmatter.contributionType === "risk-finding" || c.frontmatter.contributionType === "blocker-report")
|
|
16006
|
+
);
|
|
16007
|
+
const blockers = {
|
|
16008
|
+
openQuestions: questions.map((q) => ({
|
|
16009
|
+
id: q.frontmatter.id,
|
|
16010
|
+
title: q.frontmatter.title
|
|
16011
|
+
})),
|
|
16012
|
+
openRiskAndBlockerContributions: openBlockerContributions.map((c) => ({
|
|
16013
|
+
id: c.frontmatter.id,
|
|
16014
|
+
title: c.frontmatter.title,
|
|
16015
|
+
contributionType: c.frontmatter.contributionType
|
|
16016
|
+
}))
|
|
16017
|
+
};
|
|
16018
|
+
const totalBacklogEfforts = backlog.filter((e) => e.estimatedEffort !== null).map((e) => String(e.estimatedEffort));
|
|
16019
|
+
const approvedFeaturesWithNoEpics = approvedFeatures.filter((f) => f.epicCount === 0).map((f) => ({ id: f.id, title: f.title }));
|
|
16020
|
+
const now = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
16021
|
+
const epicsAtRisk = epics.filter((e) => {
|
|
16022
|
+
if (e.frontmatter.status === "done") return false;
|
|
16023
|
+
if (e.frontmatter.targetDate && e.frontmatter.targetDate < now) return true;
|
|
16024
|
+
const parent = featureMap.get(e.frontmatter.linkedFeature);
|
|
16025
|
+
if (parent?.frontmatter.status === "deferred") return true;
|
|
16026
|
+
return false;
|
|
16027
|
+
}).map((e) => ({
|
|
16028
|
+
id: e.frontmatter.id,
|
|
16029
|
+
title: e.frontmatter.title,
|
|
16030
|
+
reason: e.frontmatter.targetDate && e.frontmatter.targetDate < now ? "past-target-date" : "deferred-feature"
|
|
16031
|
+
}));
|
|
16032
|
+
const plannedSprintCount = sprints.filter((s) => s.frontmatter.status === "planned").length;
|
|
16033
|
+
const summary = {
|
|
16034
|
+
totalBacklogEpics: backlog.length,
|
|
16035
|
+
totalBacklogEfforts,
|
|
16036
|
+
approvedFeaturesWithNoEpics,
|
|
16037
|
+
epicsAtRisk,
|
|
16038
|
+
plannedSprintCount
|
|
16039
|
+
};
|
|
16040
|
+
const result = {
|
|
16041
|
+
approvedFeatures,
|
|
16042
|
+
backlog,
|
|
16043
|
+
activeSprint,
|
|
16044
|
+
velocityReference,
|
|
16045
|
+
blockers,
|
|
16046
|
+
summary,
|
|
16047
|
+
...args.sprintDurationDays !== void 0 ? { sprintDurationDays: args.sprintDurationDays } : {}
|
|
16048
|
+
};
|
|
16049
|
+
return {
|
|
16050
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
|
|
16051
|
+
};
|
|
16052
|
+
},
|
|
16053
|
+
{ annotations: { readOnly: true } }
|
|
16054
|
+
)
|
|
16055
|
+
];
|
|
16056
|
+
}
|
|
16057
|
+
|
|
15876
16058
|
// src/plugins/common.ts
|
|
15877
16059
|
var COMMON_REGISTRATIONS = [
|
|
15878
16060
|
{ type: "meeting", dirName: "meetings", idPrefix: "M" },
|
|
@@ -15889,7 +16071,8 @@ function createCommonTools(store) {
|
|
|
15889
16071
|
...createFeatureTools(store),
|
|
15890
16072
|
...createEpicTools(store),
|
|
15891
16073
|
...createContributionTools(store),
|
|
15892
|
-
...createSprintTools(store)
|
|
16074
|
+
...createSprintTools(store),
|
|
16075
|
+
...createSprintPlanningTools(store)
|
|
15893
16076
|
];
|
|
15894
16077
|
}
|
|
15895
16078
|
|
|
@@ -15962,7 +16145,12 @@ var genericAgilePlugin = {
|
|
|
15962
16145
|
- **list_sprints** / **get_sprint**: View sprints to understand iteration scope and delivery dates.
|
|
15963
16146
|
- **update_sprint**: Assign epics to sprints by updating linkedEpics when breaking features into work.
|
|
15964
16147
|
- Tag technical actions and decisions with \`sprint:SP-xxx\` to associate them with a sprint.
|
|
15965
|
-
- Use **generate_sprint_progress** to track technical work completion within an iteration
|
|
16148
|
+
- Use **generate_sprint_progress** to track technical work completion within an iteration.
|
|
16149
|
+
|
|
16150
|
+
**Sprint Planning:**
|
|
16151
|
+
- When asked to plan or propose a sprint, ALWAYS call **gather_sprint_planning_context** first.
|
|
16152
|
+
- Focus on: technical readiness of each epic, open technical questions or spikes, effort balance across the sprint, and feature coverage.
|
|
16153
|
+
- Present a structured sprint proposal with technical rationale for each selected epic, known technical risks, and any prerequisite work that should be completed first.`,
|
|
15966
16154
|
"delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
|
|
15967
16155
|
|
|
15968
16156
|
**Report Tools:**
|
|
@@ -16010,7 +16198,13 @@ var genericAgilePlugin = {
|
|
|
16010
16198
|
- Assign epics to sprints via linkedEpics.
|
|
16011
16199
|
- Tag work items (actions, decisions, questions) with \`sprint:SP-xxx\` for sprint scoping.
|
|
16012
16200
|
- Track delivery dates and flag at-risk sprints.
|
|
16013
|
-
- Register past/completed sprints for historical tracking
|
|
16201
|
+
- Register past/completed sprints for historical tracking.
|
|
16202
|
+
|
|
16203
|
+
**Sprint Planning:**
|
|
16204
|
+
- 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.
|
|
16205
|
+
- Reason through: priority (critical/high features first), capacity (compare backlog effort to velocity reference), dependencies and blockers, balance across features, and risk.
|
|
16206
|
+
- Present a structured sprint proposal: title, goal, suggested dates, selected epics with rationale for each, excluded epics with reason, and identified risks.
|
|
16207
|
+
- After user confirmation, use **create_sprint** with the agreed epics to persist the sprint.`,
|
|
16014
16208
|
"*": `You have access to feature, epic, sprint, and meeting tools for project coordination:
|
|
16015
16209
|
|
|
16016
16210
|
**Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
|
|
@@ -16033,10 +16227,10 @@ var genericAgilePlugin = {
|
|
|
16033
16227
|
};
|
|
16034
16228
|
|
|
16035
16229
|
// src/plugins/builtin/tools/use-cases.ts
|
|
16036
|
-
import { tool as
|
|
16230
|
+
import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
|
|
16037
16231
|
function createUseCaseTools(store) {
|
|
16038
16232
|
return [
|
|
16039
|
-
|
|
16233
|
+
tool14(
|
|
16040
16234
|
"list_use_cases",
|
|
16041
16235
|
"List all extension use cases, optionally filtered by status or extension type",
|
|
16042
16236
|
{
|
|
@@ -16066,7 +16260,7 @@ function createUseCaseTools(store) {
|
|
|
16066
16260
|
},
|
|
16067
16261
|
{ annotations: { readOnly: true } }
|
|
16068
16262
|
),
|
|
16069
|
-
|
|
16263
|
+
tool14(
|
|
16070
16264
|
"get_use_case",
|
|
16071
16265
|
"Get the full content of a specific use case by ID",
|
|
16072
16266
|
{ id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
|
|
@@ -16093,7 +16287,7 @@ function createUseCaseTools(store) {
|
|
|
16093
16287
|
},
|
|
16094
16288
|
{ annotations: { readOnly: true } }
|
|
16095
16289
|
),
|
|
16096
|
-
|
|
16290
|
+
tool14(
|
|
16097
16291
|
"create_use_case",
|
|
16098
16292
|
"Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
|
|
16099
16293
|
{
|
|
@@ -16127,7 +16321,7 @@ function createUseCaseTools(store) {
|
|
|
16127
16321
|
};
|
|
16128
16322
|
}
|
|
16129
16323
|
),
|
|
16130
|
-
|
|
16324
|
+
tool14(
|
|
16131
16325
|
"update_use_case",
|
|
16132
16326
|
"Update an existing extension use case",
|
|
16133
16327
|
{
|
|
@@ -16157,10 +16351,10 @@ function createUseCaseTools(store) {
|
|
|
16157
16351
|
}
|
|
16158
16352
|
|
|
16159
16353
|
// src/plugins/builtin/tools/tech-assessments.ts
|
|
16160
|
-
import { tool as
|
|
16354
|
+
import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
|
|
16161
16355
|
function createTechAssessmentTools(store) {
|
|
16162
16356
|
return [
|
|
16163
|
-
|
|
16357
|
+
tool15(
|
|
16164
16358
|
"list_tech_assessments",
|
|
16165
16359
|
"List all technology assessments, optionally filtered by status",
|
|
16166
16360
|
{
|
|
@@ -16191,7 +16385,7 @@ function createTechAssessmentTools(store) {
|
|
|
16191
16385
|
},
|
|
16192
16386
|
{ annotations: { readOnly: true } }
|
|
16193
16387
|
),
|
|
16194
|
-
|
|
16388
|
+
tool15(
|
|
16195
16389
|
"get_tech_assessment",
|
|
16196
16390
|
"Get the full content of a specific technology assessment by ID",
|
|
16197
16391
|
{ id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
|
|
@@ -16218,7 +16412,7 @@ function createTechAssessmentTools(store) {
|
|
|
16218
16412
|
},
|
|
16219
16413
|
{ annotations: { readOnly: true } }
|
|
16220
16414
|
),
|
|
16221
|
-
|
|
16415
|
+
tool15(
|
|
16222
16416
|
"create_tech_assessment",
|
|
16223
16417
|
"Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
|
|
16224
16418
|
{
|
|
@@ -16289,7 +16483,7 @@ function createTechAssessmentTools(store) {
|
|
|
16289
16483
|
};
|
|
16290
16484
|
}
|
|
16291
16485
|
),
|
|
16292
|
-
|
|
16486
|
+
tool15(
|
|
16293
16487
|
"update_tech_assessment",
|
|
16294
16488
|
"Update an existing technology assessment. The linked use case cannot be changed.",
|
|
16295
16489
|
{
|
|
@@ -16319,10 +16513,10 @@ function createTechAssessmentTools(store) {
|
|
|
16319
16513
|
}
|
|
16320
16514
|
|
|
16321
16515
|
// src/plugins/builtin/tools/extension-designs.ts
|
|
16322
|
-
import { tool as
|
|
16516
|
+
import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
|
|
16323
16517
|
function createExtensionDesignTools(store) {
|
|
16324
16518
|
return [
|
|
16325
|
-
|
|
16519
|
+
tool16(
|
|
16326
16520
|
"list_extension_designs",
|
|
16327
16521
|
"List all extension designs, optionally filtered by status",
|
|
16328
16522
|
{
|
|
@@ -16352,7 +16546,7 @@ function createExtensionDesignTools(store) {
|
|
|
16352
16546
|
},
|
|
16353
16547
|
{ annotations: { readOnly: true } }
|
|
16354
16548
|
),
|
|
16355
|
-
|
|
16549
|
+
tool16(
|
|
16356
16550
|
"get_extension_design",
|
|
16357
16551
|
"Get the full content of a specific extension design by ID",
|
|
16358
16552
|
{ id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
|
|
@@ -16379,7 +16573,7 @@ function createExtensionDesignTools(store) {
|
|
|
16379
16573
|
},
|
|
16380
16574
|
{ annotations: { readOnly: true } }
|
|
16381
16575
|
),
|
|
16382
|
-
|
|
16576
|
+
tool16(
|
|
16383
16577
|
"create_extension_design",
|
|
16384
16578
|
"Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
|
|
16385
16579
|
{
|
|
@@ -16447,7 +16641,7 @@ function createExtensionDesignTools(store) {
|
|
|
16447
16641
|
};
|
|
16448
16642
|
}
|
|
16449
16643
|
),
|
|
16450
|
-
|
|
16644
|
+
tool16(
|
|
16451
16645
|
"update_extension_design",
|
|
16452
16646
|
"Update an existing extension design. The linked tech assessment cannot be changed.",
|
|
16453
16647
|
{
|
|
@@ -16476,10 +16670,10 @@ function createExtensionDesignTools(store) {
|
|
|
16476
16670
|
}
|
|
16477
16671
|
|
|
16478
16672
|
// src/plugins/builtin/tools/aem-reports.ts
|
|
16479
|
-
import { tool as
|
|
16673
|
+
import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
|
|
16480
16674
|
function createAemReportTools(store) {
|
|
16481
16675
|
return [
|
|
16482
|
-
|
|
16676
|
+
tool17(
|
|
16483
16677
|
"generate_extension_portfolio",
|
|
16484
16678
|
"Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
|
|
16485
16679
|
{},
|
|
@@ -16531,7 +16725,7 @@ function createAemReportTools(store) {
|
|
|
16531
16725
|
},
|
|
16532
16726
|
{ annotations: { readOnly: true } }
|
|
16533
16727
|
),
|
|
16534
|
-
|
|
16728
|
+
tool17(
|
|
16535
16729
|
"generate_tech_readiness",
|
|
16536
16730
|
"Generate a BTP technology readiness report showing service coverage and gaps across assessments",
|
|
16537
16731
|
{},
|
|
@@ -16583,7 +16777,7 @@ function createAemReportTools(store) {
|
|
|
16583
16777
|
},
|
|
16584
16778
|
{ annotations: { readOnly: true } }
|
|
16585
16779
|
),
|
|
16586
|
-
|
|
16780
|
+
tool17(
|
|
16587
16781
|
"generate_phase_status",
|
|
16588
16782
|
"Generate a phase progress report showing artifact counts and readiness per AEM phase",
|
|
16589
16783
|
{},
|
|
@@ -16645,11 +16839,11 @@ function createAemReportTools(store) {
|
|
|
16645
16839
|
import * as fs6 from "fs";
|
|
16646
16840
|
import * as path6 from "path";
|
|
16647
16841
|
import * as YAML4 from "yaml";
|
|
16648
|
-
import { tool as
|
|
16842
|
+
import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
|
|
16649
16843
|
var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
|
|
16650
16844
|
function createAemPhaseTools(store, marvinDir) {
|
|
16651
16845
|
return [
|
|
16652
|
-
|
|
16846
|
+
tool18(
|
|
16653
16847
|
"get_current_phase",
|
|
16654
16848
|
"Get the current AEM phase from project configuration",
|
|
16655
16849
|
{},
|
|
@@ -16670,7 +16864,7 @@ function createAemPhaseTools(store, marvinDir) {
|
|
|
16670
16864
|
},
|
|
16671
16865
|
{ annotations: { readOnly: true } }
|
|
16672
16866
|
),
|
|
16673
|
-
|
|
16867
|
+
tool18(
|
|
16674
16868
|
"advance_phase",
|
|
16675
16869
|
"Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
|
|
16676
16870
|
{
|
|
@@ -17136,7 +17330,7 @@ ${fragment}`);
|
|
|
17136
17330
|
}
|
|
17137
17331
|
|
|
17138
17332
|
// src/skills/action-tools.ts
|
|
17139
|
-
import { tool as
|
|
17333
|
+
import { tool as tool19 } from "@anthropic-ai/claude-agent-sdk";
|
|
17140
17334
|
|
|
17141
17335
|
// src/skills/action-runner.ts
|
|
17142
17336
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
@@ -17226,7 +17420,7 @@ function createSkillActionTools(skills, context) {
|
|
|
17226
17420
|
if (!skill.actions) continue;
|
|
17227
17421
|
for (const action of skill.actions) {
|
|
17228
17422
|
tools.push(
|
|
17229
|
-
|
|
17423
|
+
tool19(
|
|
17230
17424
|
`${skill.id}__${action.id}`,
|
|
17231
17425
|
action.description,
|
|
17232
17426
|
{
|
|
@@ -17453,10 +17647,10 @@ ${lines.join("\n\n")}`;
|
|
|
17453
17647
|
}
|
|
17454
17648
|
|
|
17455
17649
|
// src/mcp/persona-tools.ts
|
|
17456
|
-
import { tool as
|
|
17650
|
+
import { tool as tool20 } from "@anthropic-ai/claude-agent-sdk";
|
|
17457
17651
|
function createPersonaTools(ctx, marvinDir) {
|
|
17458
17652
|
return [
|
|
17459
|
-
|
|
17653
|
+
tool20(
|
|
17460
17654
|
"set_persona",
|
|
17461
17655
|
"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.",
|
|
17462
17656
|
{
|
|
@@ -17486,7 +17680,7 @@ ${summaries}`
|
|
|
17486
17680
|
};
|
|
17487
17681
|
}
|
|
17488
17682
|
),
|
|
17489
|
-
|
|
17683
|
+
tool20(
|
|
17490
17684
|
"get_persona_guidance",
|
|
17491
17685
|
"Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
|
|
17492
17686
|
{
|