mrvn-cli 0.2.2 → 0.2.4

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.
@@ -15526,19 +15526,141 @@ function createEpicTools(store) {
15526
15526
  ];
15527
15527
  }
15528
15528
 
15529
+ // src/plugins/builtin/tools/contributions.ts
15530
+ import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
15531
+ function createContributionTools(store) {
15532
+ return [
15533
+ tool11(
15534
+ "list_contributions",
15535
+ "List all contributions in the project, optionally filtered by persona, contribution type, or status",
15536
+ {
15537
+ persona: external_exports.string().optional().describe("Filter by persona (e.g. 'tech-lead', 'product-owner')"),
15538
+ contributionType: external_exports.string().optional().describe("Filter by contribution type (e.g. 'action-result', 'risk-finding')"),
15539
+ status: external_exports.string().optional().describe("Filter by status")
15540
+ },
15541
+ async (args) => {
15542
+ let docs = store.list({ type: "contribution", status: args.status });
15543
+ if (args.persona) {
15544
+ docs = docs.filter((d) => d.frontmatter.persona === args.persona);
15545
+ }
15546
+ if (args.contributionType) {
15547
+ docs = docs.filter((d) => d.frontmatter.contributionType === args.contributionType);
15548
+ }
15549
+ const summary = docs.map((d) => ({
15550
+ id: d.frontmatter.id,
15551
+ title: d.frontmatter.title,
15552
+ status: d.frontmatter.status,
15553
+ persona: d.frontmatter.persona,
15554
+ contributionType: d.frontmatter.contributionType,
15555
+ aboutArtifact: d.frontmatter.aboutArtifact,
15556
+ created: d.frontmatter.created,
15557
+ tags: d.frontmatter.tags
15558
+ }));
15559
+ return {
15560
+ content: [{ type: "text", text: JSON.stringify(summary, null, 2) }]
15561
+ };
15562
+ },
15563
+ { annotations: { readOnly: true } }
15564
+ ),
15565
+ tool11(
15566
+ "get_contribution",
15567
+ "Get the full content of a specific contribution by ID",
15568
+ { id: external_exports.string().describe("Contribution ID (e.g. 'C-001')") },
15569
+ async (args) => {
15570
+ const doc = store.get(args.id);
15571
+ if (!doc) {
15572
+ return {
15573
+ content: [{ type: "text", text: `Contribution ${args.id} not found` }],
15574
+ isError: true
15575
+ };
15576
+ }
15577
+ return {
15578
+ content: [
15579
+ {
15580
+ type: "text",
15581
+ text: JSON.stringify(
15582
+ { ...doc.frontmatter, content: doc.content },
15583
+ null,
15584
+ 2
15585
+ )
15586
+ }
15587
+ ]
15588
+ };
15589
+ },
15590
+ { annotations: { readOnly: true } }
15591
+ ),
15592
+ tool11(
15593
+ "create_contribution",
15594
+ "Create a new contribution record from a persona",
15595
+ {
15596
+ title: external_exports.string().describe("Title of the contribution"),
15597
+ content: external_exports.string().describe("Contribution content \u2014 the input from the persona"),
15598
+ persona: external_exports.string().describe("Persona making the contribution (e.g. 'tech-lead')"),
15599
+ contributionType: external_exports.string().describe("Type of contribution (e.g. 'action-result', 'risk-finding')"),
15600
+ aboutArtifact: external_exports.string().optional().describe("Artifact ID this contribution relates to (e.g. 'A-001')"),
15601
+ status: external_exports.string().optional().describe("Status (default: 'open')"),
15602
+ tags: external_exports.array(external_exports.string()).optional().describe("Tags for categorization")
15603
+ },
15604
+ async (args) => {
15605
+ const frontmatter = {
15606
+ title: args.title,
15607
+ status: args.status ?? "open",
15608
+ persona: args.persona,
15609
+ contributionType: args.contributionType
15610
+ };
15611
+ if (args.aboutArtifact) frontmatter.aboutArtifact = args.aboutArtifact;
15612
+ if (args.tags) frontmatter.tags = args.tags;
15613
+ const doc = store.create("contribution", frontmatter, args.content);
15614
+ return {
15615
+ content: [
15616
+ {
15617
+ type: "text",
15618
+ text: `Created contribution ${doc.frontmatter.id}: ${doc.frontmatter.title}`
15619
+ }
15620
+ ]
15621
+ };
15622
+ }
15623
+ ),
15624
+ tool11(
15625
+ "update_contribution",
15626
+ "Update an existing contribution (e.g. to append an Effects section)",
15627
+ {
15628
+ id: external_exports.string().describe("Contribution ID to update"),
15629
+ title: external_exports.string().optional().describe("New title"),
15630
+ status: external_exports.string().optional().describe("New status"),
15631
+ content: external_exports.string().optional().describe("New content")
15632
+ },
15633
+ async (args) => {
15634
+ const { id, content, ...updates } = args;
15635
+ const doc = store.update(id, updates, content);
15636
+ return {
15637
+ content: [
15638
+ {
15639
+ type: "text",
15640
+ text: `Updated contribution ${doc.frontmatter.id}: ${doc.frontmatter.title}`
15641
+ }
15642
+ ]
15643
+ };
15644
+ }
15645
+ )
15646
+ ];
15647
+ }
15648
+
15529
15649
  // src/plugins/common.ts
15530
15650
  var COMMON_REGISTRATIONS = [
15531
15651
  { type: "meeting", dirName: "meetings", idPrefix: "M" },
15532
15652
  { type: "report", dirName: "reports", idPrefix: "R" },
15533
15653
  { type: "feature", dirName: "features", idPrefix: "F" },
15534
- { type: "epic", dirName: "epics", idPrefix: "E" }
15654
+ { type: "epic", dirName: "epics", idPrefix: "E" },
15655
+ { type: "contribution", dirName: "contributions", idPrefix: "C" }
15535
15656
  ];
15536
15657
  function createCommonTools(store) {
15537
15658
  return [
15538
15659
  ...createMeetingTools(store),
15539
15660
  ...createReportTools(store),
15540
15661
  ...createFeatureTools(store),
15541
- ...createEpicTools(store)
15662
+ ...createEpicTools(store),
15663
+ ...createContributionTools(store)
15542
15664
  ];
15543
15665
  }
15544
15666
 
@@ -15548,7 +15670,7 @@ var genericAgilePlugin = {
15548
15670
  name: "Generic Agile",
15549
15671
  description: "Default methodology plugin providing standard agile governance patterns for decisions, actions, and questions.",
15550
15672
  version: "0.1.0",
15551
- documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic"],
15673
+ documentTypes: ["decision", "action", "question", "meeting", "report", "feature", "epic", "contribution"],
15552
15674
  documentTypeRegistrations: [...COMMON_REGISTRATIONS],
15553
15675
  tools: (store) => [...createCommonTools(store)],
15554
15676
  promptFragments: {
@@ -15569,7 +15691,13 @@ var genericAgilePlugin = {
15569
15691
  - Create features as "draft" and approve them when requirements are clear and prioritized.
15570
15692
  - Do NOT create epics \u2014 that is the Tech Lead's responsibility. You can view epics to track progress.
15571
15693
  - Use priority levels (critical, high, medium, low) to communicate business value.
15572
- - Tag features for categorization and cross-referencing.`,
15694
+ - Tag features for categorization and cross-referencing.
15695
+
15696
+ **Contribution Tools:**
15697
+ - **list_contributions** / **get_contribution**: Browse and read contribution records.
15698
+ - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
15699
+ - **update_contribution**: Update a contribution (e.g. append effects).
15700
+ - Available contribution types: stakeholder-feedback, acceptance-result, priority-change, market-insight.`,
15573
15701
  "tech-lead": `You own epics and break approved features into implementation work.
15574
15702
 
15575
15703
  **Epic Tools:**
@@ -15590,7 +15718,13 @@ var genericAgilePlugin = {
15590
15718
  - Only create epics against approved features \u2014 create_epic enforces this.
15591
15719
  - Tag work items (actions, decisions, questions) with \`epic:E-xxx\` to group them under an epic.
15592
15720
  - Collaborate with the Delivery Manager on target dates and effort estimates.
15593
- - Each epic should have a clear scope and definition of done.`,
15721
+ - Each epic should have a clear scope and definition of done.
15722
+
15723
+ **Contribution Tools:**
15724
+ - **list_contributions** / **get_contribution**: Browse and read contribution records.
15725
+ - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
15726
+ - **update_contribution**: Update a contribution (e.g. append effects).
15727
+ - Available contribution types: action-result, spike-findings, technical-assessment, architecture-review.`,
15594
15728
  "delivery-manager": `You track delivery across features and epics, manage schedules, and report on progress.
15595
15729
 
15596
15730
  **Report Tools:**
@@ -15618,7 +15752,13 @@ var genericAgilePlugin = {
15618
15752
  - After generating any report, offer to save it with save_report for audit trail.
15619
15753
  - Proactively flag risks: unowned actions, overdue items, epics linked to deferred features.
15620
15754
  - Use feature progress reports for stakeholder updates and epic progress for sprint-level tracking.
15621
- - Use analyze_meeting after meetings to extract outcomes into governance artifacts.`,
15755
+ - Use analyze_meeting after meetings to extract outcomes into governance artifacts.
15756
+
15757
+ **Contribution Tools:**
15758
+ - **list_contributions** / **get_contribution**: Browse and read contribution records.
15759
+ - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
15760
+ - **update_contribution**: Update a contribution (e.g. append effects).
15761
+ - Available contribution types: risk-finding, blocker-report, dependency-update, status-assessment.`,
15622
15762
  "*": `You have access to feature, epic, and meeting tools for project coordination:
15623
15763
 
15624
15764
  **Features** (F-xxx): Product capabilities defined by the Product Owner. Features progress through draft \u2192 approved \u2192 done.
@@ -15630,15 +15770,20 @@ var genericAgilePlugin = {
15630
15770
  - **list_meetings** / **get_meeting**: Browse and read meeting records.
15631
15771
  - **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.
15632
15772
  - **update_meeting**: Update meeting status or notes.
15633
- - **analyze_meeting**: Analyze a meeting to extract decisions, actions, and questions as governance artifacts.`
15773
+ - **analyze_meeting**: Analyze a meeting to extract decisions, actions, and questions as governance artifacts.
15774
+
15775
+ **Contributions** (C-xxx): Structured inputs from personas outside of meetings (e.g. action results, risk findings, stakeholder feedback). Contributions are analyzed to produce governance effects.
15776
+ - **list_contributions** / **get_contribution**: Browse and read contribution records.
15777
+ - **create_contribution**: Record a contribution with persona, type, and optional related artifact.
15778
+ - **update_contribution**: Update a contribution (e.g. append effects).`
15634
15779
  }
15635
15780
  };
15636
15781
 
15637
15782
  // src/plugins/builtin/tools/use-cases.ts
15638
- import { tool as tool11 } from "@anthropic-ai/claude-agent-sdk";
15783
+ import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
15639
15784
  function createUseCaseTools(store) {
15640
15785
  return [
15641
- tool11(
15786
+ tool12(
15642
15787
  "list_use_cases",
15643
15788
  "List all extension use cases, optionally filtered by status or extension type",
15644
15789
  {
@@ -15668,7 +15813,7 @@ function createUseCaseTools(store) {
15668
15813
  },
15669
15814
  { annotations: { readOnly: true } }
15670
15815
  ),
15671
- tool11(
15816
+ tool12(
15672
15817
  "get_use_case",
15673
15818
  "Get the full content of a specific use case by ID",
15674
15819
  { id: external_exports.string().describe("Use case ID (e.g. 'UC-001')") },
@@ -15695,7 +15840,7 @@ function createUseCaseTools(store) {
15695
15840
  },
15696
15841
  { annotations: { readOnly: true } }
15697
15842
  ),
15698
- tool11(
15843
+ tool12(
15699
15844
  "create_use_case",
15700
15845
  "Create a new extension use case definition (Phase 1: Assess Extension Use Case)",
15701
15846
  {
@@ -15729,7 +15874,7 @@ function createUseCaseTools(store) {
15729
15874
  };
15730
15875
  }
15731
15876
  ),
15732
- tool11(
15877
+ tool12(
15733
15878
  "update_use_case",
15734
15879
  "Update an existing extension use case",
15735
15880
  {
@@ -15759,10 +15904,10 @@ function createUseCaseTools(store) {
15759
15904
  }
15760
15905
 
15761
15906
  // src/plugins/builtin/tools/tech-assessments.ts
15762
- import { tool as tool12 } from "@anthropic-ai/claude-agent-sdk";
15907
+ import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
15763
15908
  function createTechAssessmentTools(store) {
15764
15909
  return [
15765
- tool12(
15910
+ tool13(
15766
15911
  "list_tech_assessments",
15767
15912
  "List all technology assessments, optionally filtered by status",
15768
15913
  {
@@ -15793,7 +15938,7 @@ function createTechAssessmentTools(store) {
15793
15938
  },
15794
15939
  { annotations: { readOnly: true } }
15795
15940
  ),
15796
- tool12(
15941
+ tool13(
15797
15942
  "get_tech_assessment",
15798
15943
  "Get the full content of a specific technology assessment by ID",
15799
15944
  { id: external_exports.string().describe("Tech assessment ID (e.g. 'TA-001')") },
@@ -15820,7 +15965,7 @@ function createTechAssessmentTools(store) {
15820
15965
  },
15821
15966
  { annotations: { readOnly: true } }
15822
15967
  ),
15823
- tool12(
15968
+ tool13(
15824
15969
  "create_tech_assessment",
15825
15970
  "Create a new technology assessment linked to an assessed/approved use case (Phase 2: Assess Extension Technology)",
15826
15971
  {
@@ -15891,7 +16036,7 @@ function createTechAssessmentTools(store) {
15891
16036
  };
15892
16037
  }
15893
16038
  ),
15894
- tool12(
16039
+ tool13(
15895
16040
  "update_tech_assessment",
15896
16041
  "Update an existing technology assessment. The linked use case cannot be changed.",
15897
16042
  {
@@ -15921,10 +16066,10 @@ function createTechAssessmentTools(store) {
15921
16066
  }
15922
16067
 
15923
16068
  // src/plugins/builtin/tools/extension-designs.ts
15924
- import { tool as tool13 } from "@anthropic-ai/claude-agent-sdk";
16069
+ import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
15925
16070
  function createExtensionDesignTools(store) {
15926
16071
  return [
15927
- tool13(
16072
+ tool14(
15928
16073
  "list_extension_designs",
15929
16074
  "List all extension designs, optionally filtered by status",
15930
16075
  {
@@ -15954,7 +16099,7 @@ function createExtensionDesignTools(store) {
15954
16099
  },
15955
16100
  { annotations: { readOnly: true } }
15956
16101
  ),
15957
- tool13(
16102
+ tool14(
15958
16103
  "get_extension_design",
15959
16104
  "Get the full content of a specific extension design by ID",
15960
16105
  { id: external_exports.string().describe("Extension design ID (e.g. 'XD-001')") },
@@ -15981,7 +16126,7 @@ function createExtensionDesignTools(store) {
15981
16126
  },
15982
16127
  { annotations: { readOnly: true } }
15983
16128
  ),
15984
- tool13(
16129
+ tool14(
15985
16130
  "create_extension_design",
15986
16131
  "Create a new extension design linked to a recommended tech assessment (Phase 3: Define Extension Target Solution)",
15987
16132
  {
@@ -16049,7 +16194,7 @@ function createExtensionDesignTools(store) {
16049
16194
  };
16050
16195
  }
16051
16196
  ),
16052
- tool13(
16197
+ tool14(
16053
16198
  "update_extension_design",
16054
16199
  "Update an existing extension design. The linked tech assessment cannot be changed.",
16055
16200
  {
@@ -16078,10 +16223,10 @@ function createExtensionDesignTools(store) {
16078
16223
  }
16079
16224
 
16080
16225
  // src/plugins/builtin/tools/aem-reports.ts
16081
- import { tool as tool14 } from "@anthropic-ai/claude-agent-sdk";
16226
+ import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
16082
16227
  function createAemReportTools(store) {
16083
16228
  return [
16084
- tool14(
16229
+ tool15(
16085
16230
  "generate_extension_portfolio",
16086
16231
  "Generate a portfolio view of all use cases with their linked tech assessments and extension designs",
16087
16232
  {},
@@ -16133,7 +16278,7 @@ function createAemReportTools(store) {
16133
16278
  },
16134
16279
  { annotations: { readOnly: true } }
16135
16280
  ),
16136
- tool14(
16281
+ tool15(
16137
16282
  "generate_tech_readiness",
16138
16283
  "Generate a BTP technology readiness report showing service coverage and gaps across assessments",
16139
16284
  {},
@@ -16185,7 +16330,7 @@ function createAemReportTools(store) {
16185
16330
  },
16186
16331
  { annotations: { readOnly: true } }
16187
16332
  ),
16188
- tool14(
16333
+ tool15(
16189
16334
  "generate_phase_status",
16190
16335
  "Generate a phase progress report showing artifact counts and readiness per AEM phase",
16191
16336
  {},
@@ -16247,11 +16392,11 @@ function createAemReportTools(store) {
16247
16392
  import * as fs6 from "fs";
16248
16393
  import * as path6 from "path";
16249
16394
  import * as YAML4 from "yaml";
16250
- import { tool as tool15 } from "@anthropic-ai/claude-agent-sdk";
16395
+ import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
16251
16396
  var PHASES = ["assess-use-case", "assess-technology", "define-solution"];
16252
16397
  function createAemPhaseTools(store, marvinDir) {
16253
16398
  return [
16254
- tool15(
16399
+ tool16(
16255
16400
  "get_current_phase",
16256
16401
  "Get the current AEM phase from project configuration",
16257
16402
  {},
@@ -16272,7 +16417,7 @@ function createAemPhaseTools(store, marvinDir) {
16272
16417
  },
16273
16418
  { annotations: { readOnly: true } }
16274
16419
  ),
16275
- tool15(
16420
+ tool16(
16276
16421
  "advance_phase",
16277
16422
  "Advance to the next AEM phase. Performs soft gate checks and warns if artifacts are incomplete, but does not block.",
16278
16423
  {
@@ -16738,7 +16883,7 @@ ${fragment}`);
16738
16883
  }
16739
16884
 
16740
16885
  // src/skills/action-tools.ts
16741
- import { tool as tool16 } from "@anthropic-ai/claude-agent-sdk";
16886
+ import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
16742
16887
 
16743
16888
  // src/skills/action-runner.ts
16744
16889
  import { query } from "@anthropic-ai/claude-agent-sdk";
@@ -16828,7 +16973,7 @@ function createSkillActionTools(skills, context) {
16828
16973
  if (!skill.actions) continue;
16829
16974
  for (const action of skill.actions) {
16830
16975
  tools.push(
16831
- tool16(
16976
+ tool17(
16832
16977
  `${skill.id}__${action.id}`,
16833
16978
  action.description,
16834
16979
  {
@@ -16877,7 +17022,8 @@ var productOwner = {
16877
17022
  "Acceptance criteria",
16878
17023
  "Feature definition and prioritization"
16879
17024
  ],
16880
- documentTypes: ["decision", "question", "action", "feature"]
17025
+ documentTypes: ["decision", "question", "action", "feature"],
17026
+ contributionTypes: ["stakeholder-feedback", "acceptance-result", "priority-change", "market-insight"]
16881
17027
  };
16882
17028
 
16883
17029
  // src/personas/builtin/delivery-manager.ts
@@ -16915,7 +17061,8 @@ var deliveryManager = {
16915
17061
  "Status tracking",
16916
17062
  "Epic scheduling and tracking"
16917
17063
  ],
16918
- documentTypes: ["action", "decision", "meeting", "question", "feature", "epic"]
17064
+ documentTypes: ["action", "decision", "meeting", "question", "feature", "epic"],
17065
+ contributionTypes: ["risk-finding", "blocker-report", "dependency-update", "status-assessment"]
16919
17066
  };
16920
17067
 
16921
17068
  // src/personas/builtin/tech-lead.ts
@@ -16953,7 +17100,8 @@ var techLead = {
16953
17100
  "Non-functional requirements",
16954
17101
  "Epic creation and scoping"
16955
17102
  ],
16956
- documentTypes: ["decision", "action", "question", "epic"]
17103
+ documentTypes: ["decision", "action", "question", "epic"],
17104
+ contributionTypes: ["action-result", "spike-findings", "technical-assessment", "architecture-review"]
16957
17105
  };
16958
17106
 
16959
17107
  // src/personas/registry.ts
@@ -17050,10 +17198,10 @@ ${lines.join("\n\n")}`;
17050
17198
  }
17051
17199
 
17052
17200
  // src/mcp/persona-tools.ts
17053
- import { tool as tool17 } from "@anthropic-ai/claude-agent-sdk";
17201
+ import { tool as tool18 } from "@anthropic-ai/claude-agent-sdk";
17054
17202
  function createPersonaTools(ctx, marvinDir) {
17055
17203
  return [
17056
- tool17(
17204
+ tool18(
17057
17205
  "set_persona",
17058
17206
  "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.",
17059
17207
  {
@@ -17083,7 +17231,7 @@ ${summaries}`
17083
17231
  };
17084
17232
  }
17085
17233
  ),
17086
- tool17(
17234
+ tool18(
17087
17235
  "get_persona_guidance",
17088
17236
  "Get guidance for a persona without changing the active persona. If no persona is specified, lists all available personas with summaries.",
17089
17237
  {