mrvn-cli 0.5.18 → 0.5.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -14742,7 +14742,7 @@ function createActionTools(store) {
14742
14742
  tags: external_exports.array(external_exports.string()).optional().describe("Replace all tags. When provided with sprints, sprint tags are merged into this array."),
14743
14743
  sprints: external_exports.array(external_exports.string()).optional().describe("Sprint IDs to assign (replaces existing sprint tags). E.g. ['SP-001']."),
14744
14744
  workFocus: external_exports.string().optional().describe("Work focus name (e.g. 'Budget UX'). Replaces existing focus:<value> tag."),
14745
- progress: external_exports.number().optional().describe("Explicit progress percentage (0-100).")
14745
+ progress: external_exports.number().nullable().optional().describe("Explicit progress percentage (0-100). Pass null to clear the override and revert to auto-calculation from children.")
14746
14746
  },
14747
14747
  async (args) => {
14748
14748
  const { id, content, sprints, tags, workFocus, progress, owner, assignee, ...updates } = args;
@@ -14785,6 +14785,8 @@ function createActionTools(store) {
14785
14785
  if (typeof progress === "number") {
14786
14786
  updates.progress = Math.max(0, Math.min(100, Math.round(progress)));
14787
14787
  updates.progressOverride = true;
14788
+ } else if (progress === null) {
14789
+ updates.progressOverride = false;
14788
14790
  }
14789
14791
  const doc = store.update(id, updates, content);
14790
14792
  if (args.status !== void 0 || typeof progress === "number") {
@@ -23790,7 +23792,7 @@ function createTaskTools(store) {
23790
23792
  priority: external_exports.enum(["critical", "high", "medium", "low"]).optional().describe("New priority"),
23791
23793
  tags: external_exports.array(external_exports.string()).optional().describe("Replace tags (e.g. remove old tags, add new ones)"),
23792
23794
  workFocus: external_exports.string().optional().describe("Work focus name (e.g. 'Budget UX'). Replaces existing focus:<value> tag."),
23793
- progress: external_exports.number().optional().describe("Explicit progress percentage (0-100). Overrides auto-calculation from child contributions.")
23795
+ progress: external_exports.number().nullable().optional().describe("Explicit progress percentage (0-100). Overrides auto-calculation from child contributions. Pass null to clear the override and revert to auto-calculation.")
23794
23796
  },
23795
23797
  async (args) => {
23796
23798
  const { id, content, linkedEpic: rawLinkedEpic, tags: userTags, workFocus, progress, ...updates } = args;
@@ -23823,6 +23825,8 @@ function createTaskTools(store) {
23823
23825
  if (typeof progress === "number") {
23824
23826
  updates.progress = Math.max(0, Math.min(100, Math.round(progress)));
23825
23827
  updates.progressOverride = true;
23828
+ } else if (progress === null) {
23829
+ updates.progressOverride = false;
23826
23830
  }
23827
23831
  const doc = store.update(id, updates, content);
23828
23832
  if (args.status !== void 0 || typeof progress === "number") {
@@ -26715,16 +26719,37 @@ async function _assessArtifactRecursive(store, client, host, options, visited, d
26715
26719
  );
26716
26720
  children.push(childReport);
26717
26721
  }
26722
+ if (children.length > 0) {
26723
+ const rolledUpProgress = computeWeightedProgress(
26724
+ children.map((c) => ({
26725
+ weight: resolveWeight(void 0).weight,
26726
+ progress: c.marvinProgress
26727
+ }))
26728
+ );
26729
+ if (rolledUpProgress !== currentProgress) {
26730
+ proposedUpdates.push({
26731
+ artifactId: fm.id,
26732
+ field: "progress",
26733
+ currentValue: currentProgress,
26734
+ proposedValue: rolledUpProgress,
26735
+ reason: `Rolled up from ${children.length} children (weighted average ${rolledUpProgress}%)`
26736
+ });
26737
+ }
26738
+ }
26718
26739
  const signals = buildSignals(commentSignals, linkedIssues, statusDrift, proposedMarvinStatus);
26719
26740
  const appliedUpdates = [];
26720
26741
  if (options.applyUpdates && proposedUpdates.length > 0) {
26721
26742
  for (const update of proposedUpdates) {
26722
26743
  if (update.field === "review") continue;
26723
26744
  try {
26724
- store.update(update.artifactId, {
26745
+ const updatePayload = {
26725
26746
  [update.field]: update.proposedValue,
26726
26747
  lastJiraSyncAt: (/* @__PURE__ */ new Date()).toISOString()
26727
- });
26748
+ };
26749
+ if (update.field === "progress") {
26750
+ updatePayload.progressOverride = false;
26751
+ }
26752
+ store.update(update.artifactId, updatePayload);
26728
26753
  const updatedDoc = store.get(update.artifactId);
26729
26754
  if (updatedDoc) {
26730
26755
  if (updatedDoc.frontmatter.type === "task") {
@@ -33534,7 +33559,7 @@ function createProgram() {
33534
33559
  const program = new Command();
33535
33560
  program.name("marvin").description(
33536
33561
  "AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
33537
- ).version("0.5.18");
33562
+ ).version("0.5.19");
33538
33563
  program.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
33539
33564
  await initCommand();
33540
33565
  });