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/marvin.js CHANGED
@@ -16824,7 +16824,7 @@ function createTaskTools(store) {
16824
16824
  priority: external_exports.enum(["critical", "high", "medium", "low"]).optional().describe("New priority"),
16825
16825
  tags: external_exports.array(external_exports.string()).optional().describe("Replace tags (e.g. remove old tags, add new ones)"),
16826
16826
  workFocus: external_exports.string().optional().describe("Work focus name (e.g. 'Budget UX'). Replaces existing focus:<value> tag."),
16827
- progress: external_exports.number().optional().describe("Explicit progress percentage (0-100). Overrides auto-calculation from child contributions.")
16827
+ 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.")
16828
16828
  },
16829
16829
  async (args) => {
16830
16830
  const { id, content, linkedEpic: rawLinkedEpic, tags: userTags, workFocus, progress, ...updates } = args;
@@ -16857,6 +16857,8 @@ function createTaskTools(store) {
16857
16857
  if (typeof progress === "number") {
16858
16858
  updates.progress = Math.max(0, Math.min(100, Math.round(progress)));
16859
16859
  updates.progressOverride = true;
16860
+ } else if (progress === null) {
16861
+ updates.progressOverride = false;
16860
16862
  }
16861
16863
  const doc = store.update(id, updates, content);
16862
16864
  if (args.status !== void 0 || typeof progress === "number") {
@@ -18913,7 +18915,7 @@ function createActionTools(store) {
18913
18915
  tags: external_exports.array(external_exports.string()).optional().describe("Replace all tags. When provided with sprints, sprint tags are merged into this array."),
18914
18916
  sprints: external_exports.array(external_exports.string()).optional().describe("Sprint IDs to assign (replaces existing sprint tags). E.g. ['SP-001']."),
18915
18917
  workFocus: external_exports.string().optional().describe("Work focus name (e.g. 'Budget UX'). Replaces existing focus:<value> tag."),
18916
- progress: external_exports.number().optional().describe("Explicit progress percentage (0-100).")
18918
+ 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.")
18917
18919
  },
18918
18920
  async (args) => {
18919
18921
  const { id, content, sprints, tags, workFocus, progress, owner, assignee, ...updates } = args;
@@ -18956,6 +18958,8 @@ function createActionTools(store) {
18956
18958
  if (typeof progress === "number") {
18957
18959
  updates.progress = Math.max(0, Math.min(100, Math.round(progress)));
18958
18960
  updates.progressOverride = true;
18961
+ } else if (progress === null) {
18962
+ updates.progressOverride = false;
18959
18963
  }
18960
18964
  const doc = store.update(id, updates, content);
18961
18965
  if (args.status !== void 0 || typeof progress === "number") {
@@ -26961,16 +26965,37 @@ async function _assessArtifactRecursive(store, client, host, options, visited, d
26961
26965
  );
26962
26966
  children.push(childReport);
26963
26967
  }
26968
+ if (children.length > 0) {
26969
+ const rolledUpProgress = computeWeightedProgress(
26970
+ children.map((c) => ({
26971
+ weight: resolveWeight(void 0).weight,
26972
+ progress: c.marvinProgress
26973
+ }))
26974
+ );
26975
+ if (rolledUpProgress !== currentProgress) {
26976
+ proposedUpdates.push({
26977
+ artifactId: fm.id,
26978
+ field: "progress",
26979
+ currentValue: currentProgress,
26980
+ proposedValue: rolledUpProgress,
26981
+ reason: `Rolled up from ${children.length} children (weighted average ${rolledUpProgress}%)`
26982
+ });
26983
+ }
26984
+ }
26964
26985
  const signals = buildSignals(commentSignals, linkedIssues, statusDrift, proposedMarvinStatus);
26965
26986
  const appliedUpdates = [];
26966
26987
  if (options.applyUpdates && proposedUpdates.length > 0) {
26967
26988
  for (const update of proposedUpdates) {
26968
26989
  if (update.field === "review") continue;
26969
26990
  try {
26970
- store.update(update.artifactId, {
26991
+ const updatePayload = {
26971
26992
  [update.field]: update.proposedValue,
26972
26993
  lastJiraSyncAt: (/* @__PURE__ */ new Date()).toISOString()
26973
- });
26994
+ };
26995
+ if (update.field === "progress") {
26996
+ updatePayload.progressOverride = false;
26997
+ }
26998
+ store.update(update.artifactId, updatePayload);
26974
26999
  const updatedDoc = store.get(update.artifactId);
26975
27000
  if (updatedDoc) {
26976
27001
  if (updatedDoc.frontmatter.type === "task") {
@@ -33526,7 +33551,7 @@ function createProgram() {
33526
33551
  const program2 = new Command();
33527
33552
  program2.name("marvin").description(
33528
33553
  "AI-powered product development assistant with Product Owner, Delivery Manager, and Technical Lead personas"
33529
- ).version("0.5.18");
33554
+ ).version("0.5.19");
33530
33555
  program2.command("init").description("Initialize a new Marvin project in the current directory").action(async () => {
33531
33556
  await initCommand();
33532
33557
  });