mrvn-cli 0.5.18 → 0.5.20

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,34 @@ 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 = Math.round(
26724
+ children.reduce((s, c) => s + c.marvinProgress, 0) / children.length
26725
+ );
26726
+ if (rolledUpProgress !== currentProgress) {
26727
+ proposedUpdates.push({
26728
+ artifactId: fm.id,
26729
+ field: "progress",
26730
+ currentValue: currentProgress,
26731
+ proposedValue: rolledUpProgress,
26732
+ reason: `Rolled up from ${children.length} children (average ${rolledUpProgress}%)`
26733
+ });
26734
+ }
26735
+ }
26718
26736
  const signals = buildSignals(commentSignals, linkedIssues, statusDrift, proposedMarvinStatus);
26719
26737
  const appliedUpdates = [];
26720
26738
  if (options.applyUpdates && proposedUpdates.length > 0) {
26721
26739
  for (const update of proposedUpdates) {
26722
26740
  if (update.field === "review") continue;
26723
26741
  try {
26724
- store.update(update.artifactId, {
26742
+ const updatePayload = {
26725
26743
  [update.field]: update.proposedValue,
26726
26744
  lastJiraSyncAt: (/* @__PURE__ */ new Date()).toISOString()
26727
- });
26745
+ };
26746
+ if (update.field === "progress") {
26747
+ updatePayload.progressOverride = false;
26748
+ }
26749
+ store.update(update.artifactId, updatePayload);
26728
26750
  const updatedDoc = store.get(update.artifactId);
26729
26751
  if (updatedDoc) {
26730
26752
  if (updatedDoc.frontmatter.type === "task") {
@@ -26959,11 +26981,9 @@ function formatArtifactReport(report) {
26959
26981
  }
26960
26982
  if (report.children.length > 0) {
26961
26983
  const doneCount = report.children.filter((c) => DONE_STATUSES15.has(c.marvinStatus)).length;
26962
- const childWeights = report.children.map((c) => {
26963
- const { weight } = resolveWeight(void 0);
26964
- return { weight, progress: c.marvinProgress };
26965
- });
26966
- const childProgress = childWeights.length > 0 ? Math.round(childWeights.reduce((s, c) => s + c.weight * c.progress, 0) / childWeights.reduce((s, c) => s + c.weight, 0)) : 0;
26984
+ const childProgress = Math.round(
26985
+ report.children.reduce((s, c) => s + c.marvinProgress, 0) / report.children.length
26986
+ );
26967
26987
  const bar = progressBar6(childProgress);
26968
26988
  parts.push(`## Children (${doneCount}/${report.children.length} done) ${bar} ${childProgress}%`);
26969
26989
  for (const child of report.children) {
@@ -33534,7 +33554,7 @@ function createProgram() {
33534
33554
  const program = new Command();
33535
33555
  program.name("marvin").description(
33536
33556
  "AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
33537
- ).version("0.5.18");
33557
+ ).version("0.5.20");
33538
33558
  program.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
33539
33559
  await initCommand();
33540
33560
  });