@meltstudio/meltctl 4.159.0 → 4.160.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 +68 -12
  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.159.0";
17
+ CLI_VERSION = "4.160.0";
18
18
  }
19
19
  });
20
20
 
@@ -1062,6 +1062,15 @@ function createPmResource(config) {
1062
1062
  const res = await apiFetch(config, `/pm/phases/${phaseId}/features/${featureId}`, { method: "DELETE" });
1063
1063
  unwrap("unassign feature", res);
1064
1064
  },
1065
+ /**
1066
+ * Patch the per-phase intent for a feature in a phase (#446 stage 2).
1067
+ * Edits the through-table row's `targetStage`, `phaseDescription`, and/or
1068
+ * `linearEpicUrl`. Server returns the updated membership row.
1069
+ */
1070
+ async updatePhaseFeature(phaseId, featureId, patch) {
1071
+ const res = await apiFetch(config, `/pm/phases/${phaseId}/features/${featureId}`, { method: "PATCH", body: JSON.stringify(patch) });
1072
+ return unwrap("update phase feature", res);
1073
+ },
1065
1074
  // ─── Roadmap ──────────────────────────────────────────────────────────
1066
1075
  async getRoadmap(projectId) {
1067
1076
  const res = await apiFetch(config, `/pm/projects/${projectId}/roadmap`);
@@ -4011,6 +4020,15 @@ function createPmResource2(config) {
4011
4020
  const res = await apiFetch2(config, `/pm/phases/${phaseId}/features/${featureId}`, { method: "DELETE" });
4012
4021
  unwrap2("unassign feature", res);
4013
4022
  },
4023
+ /**
4024
+ * Patch the per-phase intent for a feature in a phase (#446 stage 2).
4025
+ * Edits the through-table row's `targetStage`, `phaseDescription`, and/or
4026
+ * `linearEpicUrl`. Server returns the updated membership row.
4027
+ */
4028
+ async updatePhaseFeature(phaseId, featureId, patch) {
4029
+ const res = await apiFetch2(config, `/pm/phases/${phaseId}/features/${featureId}`, { method: "PATCH", body: JSON.stringify(patch) });
4030
+ return unwrap2("update phase feature", res);
4031
+ },
4014
4032
  // ─── Roadmap ──────────────────────────────────────────────────────────
4015
4033
  async getRoadmap(projectId) {
4016
4034
  const res = await apiFetch2(config, `/pm/projects/${projectId}/roadmap`);
@@ -4829,6 +4847,7 @@ function registerProjectTools(server, getClient2) {
4829
4847
  }
4830
4848
  var SHAPE_VALUES = ["crawling", "walking", "running"];
4831
4849
  var SHAPE_DESC = "crawling | walking | running. Target shape is intent (PM sets when creating); current shape is computed from feature stages.";
4850
+ var STAGE_VALUES = ["idea", "poc", "pt", "mv", "mk", "ma", "mbi"];
4832
4851
  async function listPhases(client, input3) {
4833
4852
  return safe(() => client.pm.listPhases(input3.projectId, input3.includeClosed ?? false));
4834
4853
  }
@@ -4854,6 +4873,10 @@ async function assignFeatureToPhase(client, input3) {
4854
4873
  async function unassignFeatureFromPhase(client, input3) {
4855
4874
  return safe(() => client.pm.unassignFeature(input3.phaseId, input3.featureId));
4856
4875
  }
4876
+ async function updatePhaseFeature(client, input3) {
4877
+ const { phaseId, featureId, ...patch } = input3;
4878
+ return safe(() => client.pm.updatePhaseFeature(phaseId, featureId, patch));
4879
+ }
4857
4880
  var createPhaseInputSchema = z3.object({
4858
4881
  projectId: z3.number().int().positive(),
4859
4882
  name: z3.string().min(1),
@@ -4978,9 +5001,38 @@ Mandatory caller behavior: present the phase's name + id + active/closed status
4978
5001
  },
4979
5002
  withClientArgs(getClient2, unassignFeatureFromPhase)
4980
5003
  );
5004
+ server.registerTool(
5005
+ "update_phase_feature",
5006
+ {
5007
+ title: "Update phase-feature membership",
5008
+ 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.",
5009
+ inputSchema: {
5010
+ phaseId: z3.string().uuid().describe("Phase id from list_phases."),
5011
+ featureId: z3.string().uuid().describe("Feature id of the membership to edit."),
5012
+ targetStage: z3.enum(STAGE_VALUES).optional().describe(
5013
+ "Per-phase target stage. What this phase aims to bring the feature to \u2014 e.g. 'pt' for prototype in an early phase, 'mv' for MVP in a later one. 7-stage enum (idea | poc | pt | mv | mk | ma | mbi)."
5014
+ ),
5015
+ phaseDescription: z3.string().min(1).optional().describe(
5016
+ "One-line PM-voice note: what should this feature be doing once this phase's jump lands. New memberships default to 'PM to refine'."
5017
+ ),
5018
+ linearEpicUrl: z3.string().url().nullable().optional().describe(
5019
+ "Per-phase Linear epic URL. Each phase's work on a feature can be its own epic. Pass null to clear."
5020
+ )
5021
+ }
5022
+ },
5023
+ withClientArgs(getClient2, updatePhaseFeature)
5024
+ );
4981
5025
  }
4982
- var STAGE_VALUES = ["idea", "poc", "pt", "mv", "mk", "ma", "mbi"];
5026
+ var STAGE_VALUES2 = ["idea", "poc", "pt", "mv", "mk", "ma", "mbi"];
4983
5027
  var STAGE_DESC = "idea | poc | pt | mv | mk | ma | mbi. The 7 maturity stages from the workflow doc \u2014 pick the one that matches where the work *looks like* it is right now (or where it should land for target).";
5028
+ var STARTING_POINT_VALUES = [
5029
+ "unknown",
5030
+ "starter_kit",
5031
+ "saas",
5032
+ "oss_library",
5033
+ "from_scratch"
5034
+ ];
5035
+ var STARTING_POINT_DESC = "unknown | starter_kit | saas | oss_library | from_scratch. The feature's technical starting point. Drives audit calibration \u2014 a feature backed by SaaS (Stripe, Auth0) gets to MVP in one jump; one built from scratch needs more. starter_kit is called out specially in audits + portal as a Melt differentiator. Default 'unknown' for historical features where the starting point is genuinely not known \u2014 downstream consumers treat 'unknown' as 'skip this dimension', not 'from scratch'.";
4984
5036
  var PRD_PATH_DESC = "http(s) URL pointing to the PRD (Notion, Google Doc, etc.). Omit if there is no PRD yet \u2014 relative paths or plain text are rejected.";
4985
5037
  async function listFeatures(client, input3) {
4986
5038
  const { projectId, ...filters } = input3;
@@ -5008,8 +5060,9 @@ var createFeatureInputSchema = z4.object({
5008
5060
  category: z4.string().min(1),
5009
5061
  description: z4.string().optional(),
5010
5062
  prdPath: z4.string().url().optional(),
5011
- currentStage: z4.enum(STAGE_VALUES).optional(),
5012
- targetStage: z4.enum(STAGE_VALUES).optional(),
5063
+ currentStage: z4.enum(STAGE_VALUES2).optional(),
5064
+ targetStage: z4.enum(STAGE_VALUES2).optional(),
5065
+ startingPoint: z4.enum(STARTING_POINT_VALUES).optional(),
5013
5066
  status: z4.string().optional(),
5014
5067
  clientNotes: z4.string().optional(),
5015
5068
  createdAt: z4.string().datetime().optional(),
@@ -5022,8 +5075,9 @@ var updateFeatureInputSchema = z4.object({
5022
5075
  category: z4.string().min(1).optional(),
5023
5076
  description: z4.string().optional(),
5024
5077
  prdPath: z4.string().url().optional(),
5025
- currentStage: z4.enum(STAGE_VALUES).optional(),
5026
- targetStage: z4.enum(STAGE_VALUES).optional(),
5078
+ currentStage: z4.enum(STAGE_VALUES2).optional(),
5079
+ targetStage: z4.enum(STAGE_VALUES2).optional(),
5080
+ startingPoint: z4.enum(STARTING_POINT_VALUES).optional(),
5027
5081
  status: z4.string().optional(),
5028
5082
  clientNotes: z4.string().optional(),
5029
5083
  linearEpicUrl: z4.string().url().nullable().optional()
@@ -5039,8 +5093,8 @@ function registerFeatureTools(server, getClient2) {
5039
5093
  phaseId: z4.string().uuid().optional().describe("Limit to features assigned to this phase (phase_features join)."),
5040
5094
  status: z4.string().optional().describe("Filter by status \u2014 typically not_started / in_progress / done."),
5041
5095
  category: z4.string().optional().describe("Filter by roadmap category, exact match."),
5042
- currentStage: z4.enum(STAGE_VALUES).optional().describe("Filter by current_stage."),
5043
- targetStage: z4.enum(STAGE_VALUES).optional().describe("Filter by target_stage.")
5096
+ currentStage: z4.enum(STAGE_VALUES2).optional().describe("Filter by current_stage."),
5097
+ targetStage: z4.enum(STAGE_VALUES2).optional().describe("Filter by target_stage.")
5044
5098
  }
5045
5099
  },
5046
5100
  withClientArgs(getClient2, listFeatures)
@@ -5056,8 +5110,9 @@ function registerFeatureTools(server, getClient2) {
5056
5110
  category: z4.string().min(1).describe('Roadmap grouping, e.g. "Frontend & UI", "API & Data", "Ops".'),
5057
5111
  description: z4.string().optional().describe("One-sentence summary for the roadmap row."),
5058
5112
  prdPath: z4.string().url().optional().describe(PRD_PATH_DESC),
5059
- currentStage: z4.enum(STAGE_VALUES).optional().describe(`Default idea. ${STAGE_DESC}`),
5060
- targetStage: z4.enum(STAGE_VALUES).optional().describe(`Default mv. ${STAGE_DESC}`),
5113
+ currentStage: z4.enum(STAGE_VALUES2).optional().describe(`Default idea. ${STAGE_DESC}`),
5114
+ targetStage: z4.enum(STAGE_VALUES2).optional().describe(`Default mv. ${STAGE_DESC}`),
5115
+ startingPoint: z4.enum(STARTING_POINT_VALUES).optional().describe(`Default unknown. ${STARTING_POINT_DESC}`),
5061
5116
  status: z4.string().optional().describe("Default not_started. Common values: not_started, in_progress, done."),
5062
5117
  clientNotes: z4.string().optional().describe("Free-text. What blockers from the client side, if any."),
5063
5118
  createdAt: z4.string().datetime().optional().describe(
@@ -5106,8 +5161,9 @@ Mandatory caller behavior: present the feature's name + id + every phase it curr
5106
5161
  category: z4.string().min(1).optional(),
5107
5162
  description: z4.string().optional(),
5108
5163
  prdPath: z4.string().url().optional().describe(PRD_PATH_DESC),
5109
- currentStage: z4.enum(STAGE_VALUES).optional().describe(STAGE_DESC),
5110
- targetStage: z4.enum(STAGE_VALUES).optional().describe(STAGE_DESC),
5164
+ currentStage: z4.enum(STAGE_VALUES2).optional().describe(STAGE_DESC),
5165
+ targetStage: z4.enum(STAGE_VALUES2).optional().describe(STAGE_DESC),
5166
+ startingPoint: z4.enum(STARTING_POINT_VALUES).optional().describe(STARTING_POINT_DESC),
5111
5167
  status: z4.string().optional().describe("Common values: not_started, in_progress, done."),
5112
5168
  clientNotes: z4.string().optional(),
5113
5169
  linearEpicUrl: z4.string().url().nullable().optional().describe(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meltstudio/meltctl",
3
- "version": "4.159.0",
3
+ "version": "4.160.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",