@meltstudio/meltctl 4.164.0 → 4.166.0

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.
Files changed (2) hide show
  1. package/dist/index.js +73 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var CLI_VERSION;
14
14
  var init_version = __esm({
15
15
  "src/utils/version.ts"() {
16
16
  "use strict";
17
- CLI_VERSION = "4.164.0";
17
+ CLI_VERSION = "4.166.0";
18
18
  }
19
19
  });
20
20
 
@@ -1052,6 +1052,31 @@ function createPmResource(config) {
1052
1052
  });
1053
1053
  unwrap("delete phase", res);
1054
1054
  },
1055
+ // ── Scenarios (draft phases, #446 stage 6) ──────────────────────────────
1056
+ /** List saved draft scenarios for a project (hydrated like phases). */
1057
+ async listScenarios(projectId) {
1058
+ const res = await apiFetch(config, `/pm/projects/${projectId}/scenarios`);
1059
+ return unwrap("list scenarios", res);
1060
+ },
1061
+ /** Save a composed candidate phase as a draft. */
1062
+ async createScenario(projectId, input3) {
1063
+ const res = await apiFetch(config, `/pm/projects/${projectId}/scenarios`, { method: "POST", body: JSON.stringify(input3) });
1064
+ return unwrap("create scenario", res, 201);
1065
+ },
1066
+ async deleteScenario(id) {
1067
+ const res = await apiFetch(config, `/pm/scenarios/${id}`, {
1068
+ method: "DELETE"
1069
+ });
1070
+ unwrap("delete scenario", res);
1071
+ },
1072
+ /** Promote a draft scenario into a real active phase. */
1073
+ async promoteScenario(id, opts) {
1074
+ const res = await apiFetch(config, `/pm/scenarios/${id}/promote`, {
1075
+ method: "POST",
1076
+ body: JSON.stringify({ makePrimary: opts?.makePrimary ?? false })
1077
+ });
1078
+ return unwrap("promote scenario", res);
1079
+ },
1055
1080
  async assignFeature(phaseId, featureId) {
1056
1081
  const res = await apiFetch(config, `/pm/phases/${phaseId}/features`, { method: "POST", body: JSON.stringify({ featureId }) });
1057
1082
  return unwrap("assign feature", res, 201);
@@ -1502,6 +1527,15 @@ var ISSUE_RULES = [
1502
1527
  howToFix: "Run a backlog-seeding session and add features to the active phase before the team starts",
1503
1528
  scope: "project"
1504
1529
  },
1530
+ {
1531
+ id: "roadmap.closed-phase-open-work",
1532
+ dimension: "roadmap",
1533
+ severity: "medium",
1534
+ label: "Closed phase has unfinished features",
1535
+ category: "gaps",
1536
+ howToFix: "A closed phase still has features that aren't done/canceled. Decide per feature: mark it done in that phase if the work landed (update_phase_feature), or move it to an active phase if it's still in flight. (#446 stage 7)",
1537
+ scope: "project"
1538
+ },
1505
1539
  // Delivery — Board
1506
1540
  {
1507
1541
  id: "board.no-mapping",
@@ -4008,6 +4042,31 @@ function createPmResource2(config) {
4008
4042
  });
4009
4043
  unwrap2("delete phase", res);
4010
4044
  },
4045
+ // ── Scenarios (draft phases, #446 stage 6) ──────────────────────────────
4046
+ /** List saved draft scenarios for a project (hydrated like phases). */
4047
+ async listScenarios(projectId) {
4048
+ const res = await apiFetch2(config, `/pm/projects/${projectId}/scenarios`);
4049
+ return unwrap2("list scenarios", res);
4050
+ },
4051
+ /** Save a composed candidate phase as a draft. */
4052
+ async createScenario(projectId, input3) {
4053
+ const res = await apiFetch2(config, `/pm/projects/${projectId}/scenarios`, { method: "POST", body: JSON.stringify(input3) });
4054
+ return unwrap2("create scenario", res, 201);
4055
+ },
4056
+ async deleteScenario(id) {
4057
+ const res = await apiFetch2(config, `/pm/scenarios/${id}`, {
4058
+ method: "DELETE"
4059
+ });
4060
+ unwrap2("delete scenario", res);
4061
+ },
4062
+ /** Promote a draft scenario into a real active phase. */
4063
+ async promoteScenario(id, opts) {
4064
+ const res = await apiFetch2(config, `/pm/scenarios/${id}/promote`, {
4065
+ method: "POST",
4066
+ body: JSON.stringify({ makePrimary: opts?.makePrimary ?? false })
4067
+ });
4068
+ return unwrap2("promote scenario", res);
4069
+ },
4011
4070
  async assignFeature(phaseId, featureId) {
4012
4071
  const res = await apiFetch2(config, `/pm/phases/${phaseId}/features`, { method: "POST", body: JSON.stringify({ featureId }) });
4013
4072
  return unwrap2("assign feature", res, 201);
@@ -4445,6 +4504,15 @@ var ISSUE_RULES2 = [
4445
4504
  howToFix: "Run a backlog-seeding session and add features to the active phase before the team starts",
4446
4505
  scope: "project"
4447
4506
  },
4507
+ {
4508
+ id: "roadmap.closed-phase-open-work",
4509
+ dimension: "roadmap",
4510
+ severity: "medium",
4511
+ label: "Closed phase has unfinished features",
4512
+ category: "gaps",
4513
+ howToFix: "A closed phase still has features that aren't done/canceled. Decide per feature: mark it done in that phase if the work landed (update_phase_feature), or move it to an active phase if it's still in flight. (#446 stage 7)",
4514
+ scope: "project"
4515
+ },
4448
4516
  // Delivery — Board
4449
4517
  {
4450
4518
  id: "board.no-mapping",
@@ -5001,7 +5069,7 @@ Mandatory caller behavior: present the phase's name + id + active/closed status
5001
5069
  "update_phase_feature",
5002
5070
  {
5003
5071
  title: "Update phase-feature membership",
5004
- description: "Edits the per-phase intent for a feature in a phase: targetStage (what this phase aims to bring the feature to), phaseDescription (PM-authored note about what this jump means in this phase), linearEpicUrl (per-phase Linear epic). The same feature can have different per-phase targets \u2014 e.g. 'prototype' in phase 1, 'MVP' in phase 2. Use after assign_feature_to_phase when the PM wants per-membership values different from the feature-row defaults. The PM should review the proposed change before this is called \u2014 this is a write operation. Pass linearEpicUrl=null to clear the per-phase Linear link.",
5072
+ description: "Edits the per-phase intent for a feature in a phase: targetStage (what this phase aims to bring the feature to), phaseDescription (PM-authored note about what this jump means in this phase), linearEpicUrl (per-phase Linear epic), status (per-phase status \u2014 a feature can be done in one phase and in_progress in another). The same feature can have different per-phase values across phases. Use after assign_feature_to_phase when the PM wants per-membership values different from the feature-row defaults. The PM should review the proposed change before this is called \u2014 this is a write operation. Pass linearEpicUrl=null to clear the per-phase Linear link.",
5005
5073
  inputSchema: {
5006
5074
  phaseId: z3.string().uuid().describe("Phase id from list_phases."),
5007
5075
  featureId: z3.string().uuid().describe("Feature id of the membership to edit."),
@@ -5013,6 +5081,9 @@ Mandatory caller behavior: present the phase's name + id + active/closed status
5013
5081
  ),
5014
5082
  linearEpicUrl: z3.string().url().nullable().optional().describe(
5015
5083
  "Per-phase Linear epic URL. Each phase's work on a feature can be its own epic. Pass null to clear."
5084
+ ),
5085
+ status: z3.enum(["not_started", "in_progress", "done", "canceled"]).optional().describe(
5086
+ "Per-phase status (#446 stage 7). Lets a feature be 'done' in a closed phase while still 'in_progress' in the active phase. Use this to resolve the close-phase warning when work for that phase is actually complete."
5016
5087
  )
5017
5088
  }
5018
5089
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meltstudio/meltctl",
3
- "version": "4.164.0",
3
+ "version": "4.166.0",
4
4
  "description": "AI-first development tools for teams - set up AGENTS.md, Claude Code, Cursor, and OpenCode standards",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",