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 +30 -10
- package/dist/index.js.map +1 -1
- package/dist/marvin-serve.js +29 -9
- package/dist/marvin-serve.js.map +1 -1
- package/dist/marvin.js +30 -10
- package/dist/marvin.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
|
26963
|
-
|
|
26964
|
-
|
|
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.
|
|
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
|
});
|