mrvn-cli 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -18
- package/dist/index.js +299 -42
- package/dist/index.js.map +1 -1
- package/dist/marvin-serve.js +295 -40
- package/dist/marvin-serve.js.map +1 -1
- package/dist/marvin.js +324 -67
- package/dist/marvin.js.map +1 -1
- package/package.json +1 -1
package/dist/marvin-serve.js
CHANGED
|
@@ -15183,6 +15183,60 @@ function createReportTools(store) {
|
|
|
15183
15183
|
},
|
|
15184
15184
|
{ annotations: { readOnly: true } }
|
|
15185
15185
|
),
|
|
15186
|
+
tool8(
|
|
15187
|
+
"generate_sprint_progress",
|
|
15188
|
+
"Generate progress report for a sprint or all sprints, showing linked epics and tagged work items",
|
|
15189
|
+
{
|
|
15190
|
+
sprint: external_exports.string().optional().describe("Specific sprint ID (e.g. 'SP-001') or omit for all")
|
|
15191
|
+
},
|
|
15192
|
+
async (args) => {
|
|
15193
|
+
const allDocs = store.list();
|
|
15194
|
+
const sprintDocs = store.list({ type: "sprint" });
|
|
15195
|
+
const sprints = sprintDocs.filter((s) => !args.sprint || s.frontmatter.id === args.sprint).map((sprintDoc) => {
|
|
15196
|
+
const sprintId = sprintDoc.frontmatter.id;
|
|
15197
|
+
const linkedEpicIds = sprintDoc.frontmatter.linkedEpics ?? [];
|
|
15198
|
+
const linkedEpics = linkedEpicIds.map((epicId) => {
|
|
15199
|
+
const epic = store.get(epicId);
|
|
15200
|
+
return epic ? { id: epicId, title: epic.frontmatter.title, status: epic.frontmatter.status } : { id: epicId, title: "(not found)", status: "unknown" };
|
|
15201
|
+
});
|
|
15202
|
+
const workItems = allDocs.filter(
|
|
15203
|
+
(d) => d.frontmatter.type !== "sprint" && d.frontmatter.type !== "epic" && d.frontmatter.tags?.includes(`sprint:${sprintId}`)
|
|
15204
|
+
);
|
|
15205
|
+
const byStatus = {};
|
|
15206
|
+
for (const doc of workItems) {
|
|
15207
|
+
byStatus[doc.frontmatter.status] = (byStatus[doc.frontmatter.status] ?? 0) + 1;
|
|
15208
|
+
}
|
|
15209
|
+
const doneCount = (byStatus["done"] ?? 0) + (byStatus["resolved"] ?? 0) + (byStatus["closed"] ?? 0);
|
|
15210
|
+
const total = workItems.length;
|
|
15211
|
+
const completionPct = total > 0 ? Math.round(doneCount / total * 100) : 0;
|
|
15212
|
+
return {
|
|
15213
|
+
id: sprintDoc.frontmatter.id,
|
|
15214
|
+
title: sprintDoc.frontmatter.title,
|
|
15215
|
+
status: sprintDoc.frontmatter.status,
|
|
15216
|
+
goal: sprintDoc.frontmatter.goal,
|
|
15217
|
+
startDate: sprintDoc.frontmatter.startDate,
|
|
15218
|
+
endDate: sprintDoc.frontmatter.endDate,
|
|
15219
|
+
linkedEpics,
|
|
15220
|
+
workItems: {
|
|
15221
|
+
total,
|
|
15222
|
+
done: doneCount,
|
|
15223
|
+
completionPct,
|
|
15224
|
+
byStatus,
|
|
15225
|
+
items: workItems.map((d) => ({
|
|
15226
|
+
id: d.frontmatter.id,
|
|
15227
|
+
title: d.frontmatter.title,
|
|
15228
|
+
type: d.frontmatter.type,
|
|
15229
|
+
status: d.frontmatter.status
|
|
15230
|
+
}))
|
|
15231
|
+
}
|
|
15232
|
+
};
|
|
15233
|
+
});
|
|
15234
|
+
return {
|
|
15235
|
+
content: [{ type: "text", text: JSON.stringify({ sprints }, null, 2) }]
|
|
15236
|
+
};
|
|
15237
|
+
},
|
|
15238
|
+
{ annotations: { readOnly: true } }
|
|
15239
|
+
),
|
|
15186
15240
|
tool8(
|
|
15187
15241
|
"generate_feature_progress",
|
|
15188
15242
|
"Generate progress report for features and their linked epics",
|
|
@@ -15229,7 +15283,7 @@ function createReportTools(store) {
|
|
|
15229
15283
|
{
|
|
15230
15284
|
title: external_exports.string().describe("Report title"),
|
|
15231
15285
|
content: external_exports.string().describe("Full report content in markdown"),
|
|
15232
|
-
reportType: external_exports.enum(["status", "risk-register", "gar", "epic-progress", "feature-progress", "custom"]).describe("Type of report"),
|
|
15286
|
+
reportType: external_exports.enum(["status", "risk-register", "gar", "epic-progress", "feature-progress", "sprint-progress", "custom"]).describe("Type of report"),
|
|
15233
15287
|
tags: external_exports.array(external_exports.string()).optional().describe("Additional tags")
|
|
15234
15288
|
},
|
|
15235
15289
|
async (args) => {
|
|
@@ -15646,13 +15700,187 @@ function createContributionTools(store) {
|
|
|
15646
15700
|
];
|
|
15647
15701
|
}
|
|
15648
15702
|
|
|
15703
|
+
// src/plugins/builtin/tools/sprints.ts
|
|
15704
|
+
import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
|
|
15705
|
+
function createSprintTools(store) {
|
|
15706
|
+
return [
|
|
15707
|
+
tool12(
|
|
15708
|
+
"list_sprints",
|
|
15709
|
+
"List all sprints in the project, optionally filtered by status",
|
|
15710
|
+
{
|
|
15711
|
+
status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("Filter by sprint status")
|
|
15712
|
+
},
|
|
15713
|
+
async (args) => {
|
|
15714
|
+
const docs = store.list({ type: "sprint", status: args.status });
|
|
15715
|
+
const summary = docs.map((d) => ({
|
|
15716
|
+
id: d.frontmatter.id,
|
|
15717
|
+
title: d.frontmatter.title,
|
|
15718
|
+
status: d.frontmatter.status,
|
|
15719
|
+
goal: d.frontmatter.goal,
|
|
15720
|
+
startDate: d.frontmatter.startDate,
|
|
15721
|
+
endDate: d.frontmatter.endDate,
|
|
15722
|
+
linkedEpics: d.frontmatter.linkedEpics,
|
|
15723
|
+
tags: d.frontmatter.tags
|
|
15724
|
+
}));
|
|
15725
|
+
return {
|
|
15726
|
+
content: [{ type: "text", text: JSON.stringify(summary, null, 2) }]
|
|
15727
|
+
};
|
|
15728
|
+
},
|
|
15729
|
+
{ annotations: { readOnly: true } }
|
|
15730
|
+
),
|
|
15731
|
+
tool12(
|
|
15732
|
+
"get_sprint",
|
|
15733
|
+
"Get the full content of a specific sprint by ID",
|
|
15734
|
+
{ id: external_exports.string().describe("Sprint ID (e.g. 'SP-001')") },
|
|
15735
|
+
async (args) => {
|
|
15736
|
+
const doc = store.get(args.id);
|
|
15737
|
+
if (!doc) {
|
|
15738
|
+
return {
|
|
15739
|
+
content: [{ type: "text", text: `Sprint ${args.id} not found` }],
|
|
15740
|
+
isError: true
|
|
15741
|
+
};
|
|
15742
|
+
}
|
|
15743
|
+
return {
|
|
15744
|
+
content: [
|
|
15745
|
+
{
|
|
15746
|
+
type: "text",
|
|
15747
|
+
text: JSON.stringify(
|
|
15748
|
+
{ ...doc.frontmatter, content: doc.content },
|
|
15749
|
+
null,
|
|
15750
|
+
2
|
|
15751
|
+
)
|
|
15752
|
+
}
|
|
15753
|
+
]
|
|
15754
|
+
};
|
|
15755
|
+
},
|
|
15756
|
+
{ annotations: { readOnly: true } }
|
|
15757
|
+
),
|
|
15758
|
+
tool12(
|
|
15759
|
+
"create_sprint",
|
|
15760
|
+
"Create a new sprint with dates, goal, and optionally linked epics",
|
|
15761
|
+
{
|
|
15762
|
+
title: external_exports.string().describe("Sprint title"),
|
|
15763
|
+
content: external_exports.string().describe("Sprint description and objectives"),
|
|
15764
|
+
goal: external_exports.string().describe("Sprint goal \u2014 what this sprint aims to deliver"),
|
|
15765
|
+
startDate: external_exports.string().describe("Sprint start date (ISO format, e.g. '2026-03-01')"),
|
|
15766
|
+
endDate: external_exports.string().describe("Sprint end date (ISO format, e.g. '2026-03-14')"),
|
|
15767
|
+
status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("Sprint status (default: 'planned')"),
|
|
15768
|
+
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."),
|
|
15769
|
+
tags: external_exports.array(external_exports.string()).optional().describe("Additional tags")
|
|
15770
|
+
},
|
|
15771
|
+
async (args) => {
|
|
15772
|
+
const warnings = [];
|
|
15773
|
+
if (args.linkedEpics) {
|
|
15774
|
+
for (const epicId of args.linkedEpics) {
|
|
15775
|
+
const epic = store.get(epicId);
|
|
15776
|
+
if (!epic) {
|
|
15777
|
+
warnings.push(`Epic ${epicId} not found (linked anyway)`);
|
|
15778
|
+
}
|
|
15779
|
+
}
|
|
15780
|
+
}
|
|
15781
|
+
const frontmatter = {
|
|
15782
|
+
title: args.title,
|
|
15783
|
+
status: args.status ?? "planned",
|
|
15784
|
+
goal: args.goal,
|
|
15785
|
+
startDate: args.startDate,
|
|
15786
|
+
endDate: args.endDate,
|
|
15787
|
+
linkedEpics: args.linkedEpics ?? [],
|
|
15788
|
+
tags: [...args.tags ?? []]
|
|
15789
|
+
};
|
|
15790
|
+
const doc = store.create("sprint", frontmatter, args.content);
|
|
15791
|
+
const sprintId = doc.frontmatter.id;
|
|
15792
|
+
if (args.linkedEpics) {
|
|
15793
|
+
for (const epicId of args.linkedEpics) {
|
|
15794
|
+
const epic = store.get(epicId);
|
|
15795
|
+
if (epic) {
|
|
15796
|
+
const existingTags = epic.frontmatter.tags ?? [];
|
|
15797
|
+
const sprintTag = `sprint:${sprintId}`;
|
|
15798
|
+
if (!existingTags.includes(sprintTag)) {
|
|
15799
|
+
store.update(epicId, { tags: [...existingTags, sprintTag] });
|
|
15800
|
+
}
|
|
15801
|
+
}
|
|
15802
|
+
}
|
|
15803
|
+
}
|
|
15804
|
+
const parts = [`Created sprint ${sprintId}: ${doc.frontmatter.title}`];
|
|
15805
|
+
if (warnings.length > 0) {
|
|
15806
|
+
parts.push(`Warnings: ${warnings.join("; ")}`);
|
|
15807
|
+
}
|
|
15808
|
+
return {
|
|
15809
|
+
content: [{ type: "text", text: parts.join("\n") }]
|
|
15810
|
+
};
|
|
15811
|
+
}
|
|
15812
|
+
),
|
|
15813
|
+
tool12(
|
|
15814
|
+
"update_sprint",
|
|
15815
|
+
"Update an existing sprint. Cannot change id or type.",
|
|
15816
|
+
{
|
|
15817
|
+
id: external_exports.string().describe("Sprint ID to update"),
|
|
15818
|
+
title: external_exports.string().optional().describe("New title"),
|
|
15819
|
+
status: external_exports.enum(["planned", "active", "completed", "cancelled"]).optional().describe("New status"),
|
|
15820
|
+
content: external_exports.string().optional().describe("New content"),
|
|
15821
|
+
goal: external_exports.string().optional().describe("New sprint goal"),
|
|
15822
|
+
startDate: external_exports.string().optional().describe("New start date"),
|
|
15823
|
+
endDate: external_exports.string().optional().describe("New end date"),
|
|
15824
|
+
linkedEpics: external_exports.array(external_exports.string()).optional().describe("New list of linked epic IDs (replaces existing)"),
|
|
15825
|
+
tags: external_exports.array(external_exports.string()).optional().describe("New tags (replaces existing)")
|
|
15826
|
+
},
|
|
15827
|
+
async (args) => {
|
|
15828
|
+
const { id, content, linkedEpics, ...updates } = args;
|
|
15829
|
+
const existing = store.get(id);
|
|
15830
|
+
if (!existing) {
|
|
15831
|
+
return {
|
|
15832
|
+
content: [{ type: "text", text: `Sprint ${id} not found` }],
|
|
15833
|
+
isError: true
|
|
15834
|
+
};
|
|
15835
|
+
}
|
|
15836
|
+
if (linkedEpics !== void 0) {
|
|
15837
|
+
const oldLinked = existing.frontmatter.linkedEpics ?? [];
|
|
15838
|
+
const sprintTag = `sprint:${id}`;
|
|
15839
|
+
const removed = oldLinked.filter((e) => !linkedEpics.includes(e));
|
|
15840
|
+
for (const epicId of removed) {
|
|
15841
|
+
const epic = store.get(epicId);
|
|
15842
|
+
if (epic) {
|
|
15843
|
+
const tags = epic.frontmatter.tags ?? [];
|
|
15844
|
+
const filtered = tags.filter((t) => t !== sprintTag);
|
|
15845
|
+
if (filtered.length !== tags.length) {
|
|
15846
|
+
store.update(epicId, { tags: filtered });
|
|
15847
|
+
}
|
|
15848
|
+
}
|
|
15849
|
+
}
|
|
15850
|
+
const added = linkedEpics.filter((e) => !oldLinked.includes(e));
|
|
15851
|
+
for (const epicId of added) {
|
|
15852
|
+
const epic = store.get(epicId);
|
|
15853
|
+
if (epic) {
|
|
15854
|
+
const tags = epic.frontmatter.tags ?? [];
|
|
15855
|
+
if (!tags.includes(sprintTag)) {
|
|
15856
|
+
store.update(epicId, { tags: [...tags, sprintTag] });
|
|
15857
|
+
}
|
|
15858
|
+
}
|
|
15859
|
+
}
|
|
15860
|
+
updates.linkedEpics = linkedEpics;
|
|
15861
|
+
}
|
|
15862
|
+
const doc = store.update(id, updates, content);
|
|
15863
|
+
return {
|
|
15864
|
+
content: [
|
|
15865
|
+
{
|
|
15866
|
+
type: "text",
|
|
15867
|
+
text: `Updated sprint ${doc.frontmatter.id}: ${doc.frontmatter.title}`
|
|
15868
|
+
}
|
|
15869
|
+
]
|
|
15870
|
+
};
|
|
15871
|
+
}
|
|
15872
|
+
)
|
|
15873
|
+
];
|
|
15874
|
+
}
|
|
15875
|
+
|
|
15649
15876
|
// src/plugins/common.ts
|
|
15650
15877
|
var COMMON_REGISTRATIONS = [
|
|
15651
15878
|
{ type: "meeting", dirName: "meetings", idPrefix: "M" },
|
|
15652
15879
|
{ type: "report", dirName: "reports", idPrefix: "R" },
|
|
15653
15880
|
{ type: "feature", dirName: "features", idPrefix: "F" },
|
|
15654
15881
|
{ type: "epic", dirName: "epics", idPrefix: "E" },
|
|
15655
|
-
{ type: "contribution", dirName: "contributions", idPrefix: "C" }
|
|
15882
|
+
{ type: "contribution", dirName: "contributions", idPrefix: "C" },
|
|
15883
|
+
{ type: "sprint", dirName: "sprints", idPrefix: "SP" }
|
|
15656
15884
|
];
|
|
15657
15885
|
function createCommonTools(store) {
|
|
15658
15886
|
return [
|
|
@@ -15660,7 +15888,8 @@ function createCommonTools(store) {
|
|
|
15660
15888
|
...createReportTools(store),
|
|
15661
15889
|
...createFeatureTools(store),
|
|
15662
15890
|
...createEpicTools(store),
|
|
15663
|
-
...createContributionTools(store)
|
|
15891
|
+
...createContributionTools(store),
|
|
15892
|
+
...createSprintTools(store)
|
|
15664
15893
|
];
|
|
15665
15894
|
}
|
|
15666
15895
|
|
|
@@ -15670,7 +15899,7 @@ var genericAgilePlugin = {
|
|
|
15670
15899
|
name: "Generic Agile",
|
|
15671
15900
|
description: "Default methodology plugin providing standard agile governance patterns for decisions, actions, and questions.",
|
|
15672
15901
|
version: "0.1.0",
|
|
15673
|
-
documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution"],
|
|
15902
|
+
documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution", "sprint"],
|
|
15674
15903
|
documentTypeRegistrations: [...COMMON_REGISTRATIONS],
|
|
15675
15904
|
tools: (store) => [...createCommonTools(store)],
|
|
15676
15905
|
promptFragments: {
|
|
@@ -15697,7 +15926,10 @@ var genericAgilePlugin = {
|
|
|
15697
15926
|
- **list_contributions** / **get_contribution**: Browse and read contribution records.
|
|
15698
15927
|
- **create_contribution**: Record a contribution with persona, type, and optional related artifact.
|
|
15699
15928
|
- **update_contribution**: Update a contribution (e.g. append effects).
|
|
15700
|
-
- Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight
|
|
15929
|
+
- Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.
|
|
15930
|
+
|
|
15931
|
+
**Sprint Tools (read-only for awareness):**
|
|
15932
|
+
- **list_sprints** / **get_sprint**: View sprints to understand delivery timelines and iteration scope.`,
|
|
15701
15933
|
"tech-lead": `You own epics and break approved features into implementation work.
|
|
15702
15934
|
|
|
15703
15935
|
**Epic Tools:**
|
|
@@ -15724,7 +15956,13 @@ var genericAgilePlugin = {
|
|
|
15724
15956
|
- **list_contributions** / **get_contribution**: Browse and read contribution records.
|
|
15725
15957
|
- **create_contribution**: Record a contribution with persona, type, and optional related artifact.
|
|
15726
15958
|
- **update_contribution**: Update a contribution (e.g. append effects).
|
|
15727
|
-
- Available contribution types: action-result, spike-findings, technical-assessment, architecture-review
|
|
15959
|
+
- Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.
|
|
15960
|
+
|
|
15961
|
+
**Sprint Tools:**
|
|
15962
|
+
- **list_sprints** / **get_sprint**: View sprints to understand iteration scope and delivery dates.
|
|
15963
|
+
- **update_sprint**: Assign epics to sprints by updating linkedEpics when breaking features into work.
|
|
15964
|
+
- 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.`,
|
|
15728
15966
|
"delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
|
|
15729
15967
|
|
|
15730
15968
|
**Report Tools:**
|
|
@@ -15758,14 +15996,29 @@ var genericAgilePlugin = {
|
|
|
15758
15996
|
- **list_contributions** / **get_contribution**: Browse and read contribution records.
|
|
15759
15997
|
- **create_contribution**: Record a contribution with persona, type, and optional related artifact.
|
|
15760
15998
|
- **update_contribution**: Update a contribution (e.g. append effects).
|
|
15761
|
-
- Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment
|
|
15762
|
-
|
|
15999
|
+
- Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.
|
|
16000
|
+
|
|
16001
|
+
**Sprint Tools:**
|
|
16002
|
+
- **list_sprints** / **get_sprint**: Browse and read sprint definitions.
|
|
16003
|
+
- **create_sprint**: Create sprints with dates, goals, and linked epics. Use status "planned" for upcoming sprints or "active"/"completed"/"cancelled" for current/past sprints.
|
|
16004
|
+
- **update_sprint**: Update sprint status, dates, goal, or linked epics. When linkedEpics changes, affected epics are re-tagged automatically.
|
|
16005
|
+
- **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 %.
|
|
16006
|
+
- Use \`save_report\` with reportType "sprint-progress" to persist sprint reports.
|
|
16007
|
+
|
|
16008
|
+
**Sprint Workflow:**
|
|
16009
|
+
- Create sprints with clear goals and date boundaries.
|
|
16010
|
+
- Assign epics to sprints via linkedEpics.
|
|
16011
|
+
- Tag work items (actions, decisions, questions) with \`sprint:SP-xxx\` for sprint scoping.
|
|
16012
|
+
- Track delivery dates and flag at-risk sprints.
|
|
16013
|
+
- Register past/completed sprints for historical tracking.`,
|
|
16014
|
+
"*": `You have access to feature, epic, sprint, and meeting tools for project coordination:
|
|
15763
16015
|
|
|
15764
16016
|
**Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
|
|
15765
16017
|
**Epics** (E-xxx): Implementation work packages created by the Tech Lead, linked to approved features. Epics progress through planned \u2192 in-progress \u2192 done.
|
|
16018
|
+
**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).
|
|
15766
16019
|
**Meetings**: Meeting records with attendees, agendas, and notes.
|
|
15767
16020
|
|
|
15768
|
-
**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,
|
|
16021
|
+
**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.
|
|
15769
16022
|
|
|
15770
16023
|
- **list_meetings** / **get_meeting**: Browse and read meeting records.
|
|
15771
16024
|
- **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.
|
|
@@ -15780,10 +16033,10 @@ var genericAgilePlugin = {
|
|
|
15780
16033
|
};
|
|
15781
16034
|
|
|
15782
16035
|
// src/plugins/builtin/tools/use-cases.ts
|
|
15783
|
-
import { tool as
|
|
16036
|
+
import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
|
|
15784
16037
|
function createUseCaseTools(store) {
|
|
15785
16038
|
return [
|
|
15786
|
-
|
|
16039
|
+
tool13(
|
|
15787
16040
|
"list_use_cases",
|
|
15788
16041
|
"List all extension use cases, optionally filtered by status or extension type",
|
|
15789
16042
|
{
|
|
@@ -15813,7 +16066,7 @@ function createUseCaseTools(store) {
|
|
|
15813
16066
|
},
|
|
15814
16067
|
{ annotations: { readOnly: true } }
|
|
15815
16068
|
),
|
|
15816
|
-
|
|
16069
|
+
tool13(
|
|
15817
16070
|
"get_use_case",
|
|
15818
16071
|
"Get the full content of a specific use case by ID",
|
|
15819
16072
|
{ id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
|
|
@@ -15840,7 +16093,7 @@ function createUseCaseTools(store) {
|
|
|
15840
16093
|
},
|
|
15841
16094
|
{ annotations: { readOnly: true } }
|
|
15842
16095
|
),
|
|
15843
|
-
|
|
16096
|
+
tool13(
|
|
15844
16097
|
"create_use_case",
|
|
15845
16098
|
"Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
|
|
15846
16099
|
{
|
|
@@ -15874,7 +16127,7 @@ function createUseCaseTools(store) {
|
|
|
15874
16127
|
};
|
|
15875
16128
|
}
|
|
15876
16129
|
),
|
|
15877
|
-
|
|
16130
|
+
tool13(
|
|
15878
16131
|
"update_use_case",
|
|
15879
16132
|
"Update an existing extension use case",
|
|
15880
16133
|
{
|
|
@@ -15904,10 +16157,10 @@ function createUseCaseTools(store) {
|
|
|
15904
16157
|
}
|
|
15905
16158
|
|
|
15906
16159
|
// src/plugins/builtin/tools/tech-assessments.ts
|
|
15907
|
-
import { tool as
|
|
16160
|
+
import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
|
|
15908
16161
|
function createTechAssessmentTools(store) {
|
|
15909
16162
|
return [
|
|
15910
|
-
|
|
16163
|
+
tool14(
|
|
15911
16164
|
"list_tech_assessments",
|
|
15912
16165
|
"List all technology assessments, optionally filtered by status",
|
|
15913
16166
|
{
|
|
@@ -15938,7 +16191,7 @@ function createTechAssessmentTools(store) {
|
|
|
15938
16191
|
},
|
|
15939
16192
|
{ annotations: { readOnly: true } }
|
|
15940
16193
|
),
|
|
15941
|
-
|
|
16194
|
+
tool14(
|
|
15942
16195
|
"get_tech_assessment",
|
|
15943
16196
|
"Get the full content of a specific technology assessment by ID",
|
|
15944
16197
|
{ id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
|
|
@@ -15965,7 +16218,7 @@ function createTechAssessmentTools(store) {
|
|
|
15965
16218
|
},
|
|
15966
16219
|
{ annotations: { readOnly: true } }
|
|
15967
16220
|
),
|
|
15968
|
-
|
|
16221
|
+
tool14(
|
|
15969
16222
|
"create_tech_assessment",
|
|
15970
16223
|
"Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
|
|
15971
16224
|
{
|
|
@@ -16036,7 +16289,7 @@ function createTechAssessmentTools(store) {
|
|
|
16036
16289
|
};
|
|
16037
16290
|
}
|
|
16038
16291
|
),
|
|
16039
|
-
|
|
16292
|
+
tool14(
|
|
16040
16293
|
"update_tech_assessment",
|
|
16041
16294
|
"Update an existing technology assessment. The linked use case cannot be changed.",
|
|
16042
16295
|
{
|
|
@@ -16066,10 +16319,10 @@ function createTechAssessmentTools(store) {
|
|
|
16066
16319
|
}
|
|
16067
16320
|
|
|
16068
16321
|
// src/plugins/builtin/tools/extension-designs.ts
|
|
16069
|
-
import { tool as
|
|
16322
|
+
import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
|
|
16070
16323
|
function createExtensionDesignTools(store) {
|
|
16071
16324
|
return [
|
|
16072
|
-
|
|
16325
|
+
tool15(
|
|
16073
16326
|
"list_extension_designs",
|
|
16074
16327
|
"List all extension designs, optionally filtered by status",
|
|
16075
16328
|
{
|
|
@@ -16099,7 +16352,7 @@ function createExtensionDesignTools(store) {
|
|
|
16099
16352
|
},
|
|
16100
16353
|
{ annotations: { readOnly: true } }
|
|
16101
16354
|
),
|
|
16102
|
-
|
|
16355
|
+
tool15(
|
|
16103
16356
|
"get_extension_design",
|
|
16104
16357
|
"Get the full content of a specific extension design by ID",
|
|
16105
16358
|
{ id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
|
|
@@ -16126,7 +16379,7 @@ function createExtensionDesignTools(store) {
|
|
|
16126
16379
|
},
|
|
16127
16380
|
{ annotations: { readOnly: true } }
|
|
16128
16381
|
),
|
|
16129
|
-
|
|
16382
|
+
tool15(
|
|
16130
16383
|
"create_extension_design",
|
|
16131
16384
|
"Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
|
|
16132
16385
|
{
|
|
@@ -16194,7 +16447,7 @@ function createExtensionDesignTools(store) {
|
|
|
16194
16447
|
};
|
|
16195
16448
|
}
|
|
16196
16449
|
),
|
|
16197
|
-
|
|
16450
|
+
tool15(
|
|
16198
16451
|
"update_extension_design",
|
|
16199
16452
|
"Update an existing extension design. The linked tech assessment cannot be changed.",
|
|
16200
16453
|
{
|
|
@@ -16223,10 +16476,10 @@ function createExtensionDesignTools(store) {
|
|
|
16223
16476
|
}
|
|
16224
16477
|
|
|
16225
16478
|
// src/plugins/builtin/tools/aem-reports.ts
|
|
16226
|
-
import { tool as
|
|
16479
|
+
import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
|
|
16227
16480
|
function createAemReportTools(store) {
|
|
16228
16481
|
return [
|
|
16229
|
-
|
|
16482
|
+
tool16(
|
|
16230
16483
|
"generate_extension_portfolio",
|
|
16231
16484
|
"Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
|
|
16232
16485
|
{},
|
|
@@ -16278,7 +16531,7 @@ function createAemReportTools(store) {
|
|
|
16278
16531
|
},
|
|
16279
16532
|
{ annotations: { readOnly: true } }
|
|
16280
16533
|
),
|
|
16281
|
-
|
|
16534
|
+
tool16(
|
|
16282
16535
|
"generate_tech_readiness",
|
|
16283
16536
|
"Generate a BTP technology readiness report showing service coverage and gaps across assessments",
|
|
16284
16537
|
{},
|
|
@@ -16330,7 +16583,7 @@ function createAemReportTools(store) {
|
|
|
16330
16583
|
},
|
|
16331
16584
|
{ annotations: { readOnly: true } }
|
|
16332
16585
|
),
|
|
16333
|
-
|
|
16586
|
+
tool16(
|
|
16334
16587
|
"generate_phase_status",
|
|
16335
16588
|
"Generate a phase progress report showing artifact counts and readiness per AEM phase",
|
|
16336
16589
|
{},
|
|
@@ -16392,11 +16645,11 @@ function createAemReportTools(store) {
|
|
|
16392
16645
|
import * as fs6 from "fs";
|
|
16393
16646
|
import * as path6 from "path";
|
|
16394
16647
|
import * as YAML4 from "yaml";
|
|
16395
|
-
import { tool as
|
|
16648
|
+
import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
|
|
16396
16649
|
var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
|
|
16397
16650
|
function createAemPhaseTools(store, marvinDir) {
|
|
16398
16651
|
return [
|
|
16399
|
-
|
|
16652
|
+
tool17(
|
|
16400
16653
|
"get_current_phase",
|
|
16401
16654
|
"Get the current AEM phase from project configuration",
|
|
16402
16655
|
{},
|
|
@@ -16417,7 +16670,7 @@ function createAemPhaseTools(store, marvinDir) {
|
|
|
16417
16670
|
},
|
|
16418
16671
|
{ annotations: { readOnly: true } }
|
|
16419
16672
|
),
|
|
16420
|
-
|
|
16673
|
+
tool17(
|
|
16421
16674
|
"advance_phase",
|
|
16422
16675
|
"Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
|
|
16423
16676
|
{
|
|
@@ -16883,7 +17136,7 @@ ${fragment}`);
|
|
|
16883
17136
|
}
|
|
16884
17137
|
|
|
16885
17138
|
// src/skills/action-tools.ts
|
|
16886
|
-
import { tool as
|
|
17139
|
+
import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
|
|
16887
17140
|
|
|
16888
17141
|
// src/skills/action-runner.ts
|
|
16889
17142
|
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
@@ -16973,7 +17226,7 @@ function createSkillActionTools(skills, context) {
|
|
|
16973
17226
|
if (!skill.actions) continue;
|
|
16974
17227
|
for (const action of skill.actions) {
|
|
16975
17228
|
tools.push(
|
|
16976
|
-
|
|
17229
|
+
tool18(
|
|
16977
17230
|
`${skill.id}__${action.id}`,
|
|
16978
17231
|
action.description,
|
|
16979
17232
|
{
|
|
@@ -17059,9 +17312,10 @@ var deliveryManager = {
|
|
|
17059
17312
|
"Team coordination",
|
|
17060
17313
|
"Process governance",
|
|
17061
17314
|
"Status tracking",
|
|
17062
|
-
"Epic scheduling and tracking"
|
|
17315
|
+
"Epic scheduling and tracking",
|
|
17316
|
+
"Sprint planning and tracking"
|
|
17063
17317
|
],
|
|
17064
|
-
documentTypes: ["action", "decision", "meeting", "question", "feature", "epic"],
|
|
17318
|
+
documentTypes: ["action", "decision", "meeting", "question", "feature", "epic", "sprint"],
|
|
17065
17319
|
contributionTypes: ["risk-finding", "blocker-report", "dependency-update", "status-assessment"]
|
|
17066
17320
|
};
|
|
17067
17321
|
|
|
@@ -17098,9 +17352,10 @@ var techLead = {
|
|
|
17098
17352
|
"Technical decisions",
|
|
17099
17353
|
"Implementation guidance",
|
|
17100
17354
|
"Non-functional requirements",
|
|
17101
|
-
"Epic creation and scoping"
|
|
17355
|
+
"Epic creation and scoping",
|
|
17356
|
+
"Sprint scoping and technical execution"
|
|
17102
17357
|
],
|
|
17103
|
-
documentTypes: ["decision", "action", "question", "epic"],
|
|
17358
|
+
documentTypes: ["decision", "action", "question", "epic", "sprint"],
|
|
17104
17359
|
contributionTypes: ["action-result", "spike-findings", "technical-assessment", "architecture-review"]
|
|
17105
17360
|
};
|
|
17106
17361
|
|
|
@@ -17198,10 +17453,10 @@ ${lines.join("\n\n")}`;
|
|
|
17198
17453
|
}
|
|
17199
17454
|
|
|
17200
17455
|
// src/mcp/persona-tools.ts
|
|
17201
|
-
import { tool as
|
|
17456
|
+
import { tool as tool19 } from "@anthropic-ai/claude-agent-sdk";
|
|
17202
17457
|
function createPersonaTools(ctx, marvinDir) {
|
|
17203
17458
|
return [
|
|
17204
|
-
|
|
17459
|
+
tool19(
|
|
17205
17460
|
"set_persona",
|
|
17206
17461
|
"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.",
|
|
17207
17462
|
{
|
|
@@ -17231,7 +17486,7 @@ ${summaries}`
|
|
|
17231
17486
|
};
|
|
17232
17487
|
}
|
|
17233
17488
|
),
|
|
17234
|
-
|
|
17489
|
+
tool19(
|
|
17235
17490
|
"get_persona_guidance",
|
|
17236
17491
|
"Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
|
|
17237
17492
|
{
|