@meltstudio/meltctl 5.2.0 → 5.4.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 +65 -3
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7450,7 +7450,7 @@ var CLI_VERSION;
7450
7450
  var init_version = __esm({
7451
7451
  "src/utils/version.ts"() {
7452
7452
  "use strict";
7453
- CLI_VERSION = "5.2.0";
7453
+ CLI_VERSION = "5.4.0";
7454
7454
  }
7455
7455
  });
7456
7456
 
@@ -27278,6 +27278,29 @@ function createPmResource(config2) {
27278
27278
  });
27279
27279
  return unwrap("close phase", res);
27280
27280
  },
27281
+ /**
27282
+ * Lock a scenario into a proposed phase (scenario-planner slice 1):
27283
+ * `scenario → proposed`. The phase starts feeding the planning baseline.
27284
+ * Manager-only; throws if the phase isn't in the `scenario` state.
27285
+ */
27286
+ async lockPhase(id) {
27287
+ const res = await apiFetch(config2, `/pm/phases/${id}/lock`, {
27288
+ method: "POST"
27289
+ });
27290
+ return unwrap("lock phase", res);
27291
+ },
27292
+ /**
27293
+ * Activate a proposed phase into the project's live primary (scenario-
27294
+ * planner slice 1): `proposed → active`. Demotes any existing primary to
27295
+ * `proposed`. Manager-only; throws if the phase isn't in the `proposed`
27296
+ * state.
27297
+ */
27298
+ async activatePhase(id) {
27299
+ const res = await apiFetch(config2, `/pm/phases/${id}/activate`, {
27300
+ method: "POST"
27301
+ });
27302
+ return unwrap("activate phase", res);
27303
+ },
27281
27304
  async deletePhase(id) {
27282
27305
  const res = await apiFetch(config2, `/pm/phases/${id}`, {
27283
27306
  method: "DELETE"
@@ -27330,6 +27353,11 @@ function createPmResource(config2) {
27330
27353
  * Patch the per-phase intent for a feature in a phase (#446 stage 2).
27331
27354
  * Edits the through-table row's `targetStage`, `phaseDescription`, and/or
27332
27355
  * `linearEpicUrl`. Server returns the updated membership row.
27356
+ *
27357
+ * Editing a membership inside a LOCKED phase (state `proposed`/`active`)
27358
+ * ripples through downstream baselines on the next read, so it requires
27359
+ * `force: true` (scenario-planner slice 1); without it the server rejects
27360
+ * with 409. Ignored for scenario/completed phases.
27333
27361
  */
27334
27362
  async updatePhaseFeature(phaseId, featureId, patch) {
27335
27363
  const res = await apiFetch(config2, `/pm/phases/${phaseId}/features/${featureId}`, { method: "PATCH", body: JSON.stringify(patch) });
@@ -53525,6 +53553,29 @@ function createPmResource2(config2) {
53525
53553
  });
53526
53554
  return unwrap2("close phase", res);
53527
53555
  },
53556
+ /**
53557
+ * Lock a scenario into a proposed phase (scenario-planner slice 1):
53558
+ * `scenario → proposed`. The phase starts feeding the planning baseline.
53559
+ * Manager-only; throws if the phase isn't in the `scenario` state.
53560
+ */
53561
+ async lockPhase(id) {
53562
+ const res = await apiFetch2(config2, `/pm/phases/${id}/lock`, {
53563
+ method: "POST"
53564
+ });
53565
+ return unwrap2("lock phase", res);
53566
+ },
53567
+ /**
53568
+ * Activate a proposed phase into the project's live primary (scenario-
53569
+ * planner slice 1): `proposed → active`. Demotes any existing primary to
53570
+ * `proposed`. Manager-only; throws if the phase isn't in the `proposed`
53571
+ * state.
53572
+ */
53573
+ async activatePhase(id) {
53574
+ const res = await apiFetch2(config2, `/pm/phases/${id}/activate`, {
53575
+ method: "POST"
53576
+ });
53577
+ return unwrap2("activate phase", res);
53578
+ },
53528
53579
  async deletePhase(id) {
53529
53580
  const res = await apiFetch2(config2, `/pm/phases/${id}`, {
53530
53581
  method: "DELETE"
@@ -53577,6 +53628,11 @@ function createPmResource2(config2) {
53577
53628
  * Patch the per-phase intent for a feature in a phase (#446 stage 2).
53578
53629
  * Edits the through-table row's `targetStage`, `phaseDescription`, and/or
53579
53630
  * `linearEpicUrl`. Server returns the updated membership row.
53631
+ *
53632
+ * Editing a membership inside a LOCKED phase (state `proposed`/`active`)
53633
+ * ripples through downstream baselines on the next read, so it requires
53634
+ * `force: true` (scenario-planner slice 1); without it the server rejects
53635
+ * with 409. Ignored for scenario/completed phases.
53580
53636
  */
53581
53637
  async updatePhaseFeature(phaseId, featureId, patch) {
53582
53638
  const res = await apiFetch2(config2, `/pm/phases/${phaseId}/features/${featureId}`, { method: "PATCH", body: JSON.stringify(patch) });
@@ -54846,7 +54902,7 @@ function registerPhaseTools(server, getClient2) {
54846
54902
  "update_phase",
54847
54903
  {
54848
54904
  title: "Update phase",
54849
- description: "Patches fields on an existing phase. Pass only the fields you want to change. Common uses: rename, switch target shape, override or clear the computed current shape, set or clear primary, mark a phase closed/reopened. The PM should review the proposed change before this is called \u2014 this is a write operation. Setting closedAt non-null forces isActive=false + isPrimary=false; setting isActive=false also clears isPrimary.",
54905
+ description: "Patches fields on an existing phase. Pass only the fields you want to change. Common uses: rename, switch target shape, override or clear the computed current shape, set or clear primary, mark a phase closed/reopened. The PM should review the proposed change before this is called \u2014 this is a write operation. Setting closedAt non-null forces isActive=false + isPrimary=false; setting isActive=false also clears isPrimary. Editing a LOCKED phase (state active/proposed) requires force=true.",
54850
54906
  inputSchema: {
54851
54907
  id: external_exports.string().uuid().describe("Phase id from list_phases or create_phase."),
54852
54908
  name: external_exports.string().min(1).optional(),
@@ -54866,6 +54922,9 @@ function registerPhaseTools(server, getClient2) {
54866
54922
  ),
54867
54923
  jumpDurationWeeks: external_exports.number().positive().optional().describe(
54868
54924
  "Override the project default jump duration for this phase, in weeks. Tighter (0.25-0.5) for fast iteration / proof-of-concept; longer (2-3) for hardening. The audit will eventually flag mismatches between jump duration and per-feature target stages."
54925
+ ),
54926
+ force: external_exports.boolean().optional().describe(
54927
+ "Set true to edit a LOCKED phase (state active or proposed). Locked phases feed the planning baseline, so an edit recomputes every downstream phase/scenario \u2014 the server rejects with 409 unless force=true. Not needed for scenario (draft) phases."
54869
54928
  )
54870
54929
  }
54871
54930
  },
@@ -54912,7 +54971,7 @@ Mandatory caller behavior: present the phase's name + id + active/closed status
54912
54971
  "update_phase_feature",
54913
54972
  {
54914
54973
  title: "Update phase-feature membership",
54915
- 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.",
54974
+ 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. Editing a membership in a LOCKED phase (state active/proposed) requires force=true.",
54916
54975
  inputSchema: {
54917
54976
  phaseId: external_exports.string().uuid().describe("Phase id from list_phases."),
54918
54977
  featureId: external_exports.string().uuid().describe("Feature id of the membership to edit."),
@@ -54927,6 +54986,9 @@ Mandatory caller behavior: present the phase's name + id + active/closed status
54927
54986
  ),
54928
54987
  status: external_exports.enum(["not_started", "in_progress", "done", "canceled"]).optional().describe(
54929
54988
  "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."
54989
+ ),
54990
+ force: external_exports.boolean().optional().describe(
54991
+ "Set true to edit a membership in a LOCKED phase (state active or proposed). Without it the server rejects with 409, because editing a locked phase recomputes downstream planning baselines. Not needed for scenario (draft) phases."
54930
54992
  )
54931
54993
  }
54932
54994
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meltstudio/meltctl",
3
- "version": "5.2.0",
3
+ "version": "5.4.0",
4
4
  "description": "AI-first development tooling for Melt teams — companion CLI for the org-distributed Claude Code dev skills",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",