@meltstudio/meltctl 4.149.1 → 4.150.1

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 +396 -129
  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.149.1";
17
+ CLI_VERSION = "4.150.1";
18
18
  }
19
19
  });
20
20
 
@@ -1028,10 +1028,6 @@ function createPmResource(config) {
1028
1028
  const res = await apiFetch(config, `/pm/project-audit-flags?status=${status}`);
1029
1029
  return unwrap("list all audit flags", res);
1030
1030
  },
1031
- async dismissAuditFlag(id, reason) {
1032
- const res = await apiFetch(config, `/pm/project-audit-flags/${id}/dismiss`, { method: "POST", body: JSON.stringify({ reason }) });
1033
- return unwrap("dismiss audit flag", res);
1034
- },
1035
1031
  async getAuditCatalog() {
1036
1032
  const res = await apiFetch(config, `/pm/project-audit-catalog`);
1037
1033
  return unwrap("get audit catalog", res);
@@ -1364,97 +1360,255 @@ var extractionResultSchema = z.object({
1364
1360
  // ../sdk/dist/utils/health-status.js
1365
1361
  var ISSUE_RULES = [
1366
1362
  // Delivery — Roadmap
1367
- { id: "roadmap.none", dimension: "roadmap", severity: "high", label: "No roadmap" },
1363
+ {
1364
+ id: "roadmap.none",
1365
+ dimension: "roadmap",
1366
+ severity: "high",
1367
+ label: "No roadmap",
1368
+ category: "gaps",
1369
+ howToFix: "Open the project's Roadmap tab and add an active phase with at least one planned feature",
1370
+ scope: "project"
1371
+ },
1368
1372
  {
1369
1373
  id: "roadmap.no-active-phase",
1370
1374
  dimension: "roadmap",
1371
1375
  severity: "medium",
1372
- label: "Features but no active phase"
1376
+ label: "Features but no active phase",
1377
+ category: "gaps",
1378
+ howToFix: "Open the Roadmap tab and mark the phase the team is currently working on as active",
1379
+ scope: "project"
1373
1380
  },
1374
1381
  {
1375
1382
  id: "roadmap.empty-phase",
1376
1383
  dimension: "roadmap",
1377
1384
  severity: "medium",
1378
- label: "Active phase is empty"
1385
+ label: "Active phase is empty",
1386
+ category: "gaps",
1387
+ howToFix: "Open the Roadmap tab and attach the phase's planned features, or close the phase if it's done",
1388
+ scope: "project"
1389
+ },
1390
+ {
1391
+ id: "roadmap.no-features-with-active-phase",
1392
+ dimension: "roadmap",
1393
+ severity: "high",
1394
+ label: "Active phase but no features",
1395
+ category: "sprint",
1396
+ howToFix: "Run a backlog-seeding session and add features to the active phase before the team starts",
1397
+ scope: "project"
1379
1398
  },
1380
1399
  // Delivery — Board
1381
- { id: "board.no-mapping", dimension: "board", severity: "high", label: "No board connected" },
1382
- { id: "board.empty", dimension: "board", severity: "medium", label: "Board has no open tickets" },
1383
- { id: "board.health-low", dimension: "board", severity: "high", label: "Board health below 40%" },
1400
+ {
1401
+ id: "board.no-mapping",
1402
+ dimension: "board",
1403
+ severity: "high",
1404
+ label: "No board connected",
1405
+ category: "gaps",
1406
+ howToFix: "Open Project Settings and connect a Linear team or Jira project in the mappings card",
1407
+ scope: "project"
1408
+ },
1409
+ {
1410
+ id: "tracker.no-oauth",
1411
+ dimension: "board",
1412
+ severity: "high",
1413
+ label: "Tracker needs OAuth connect",
1414
+ category: "gaps",
1415
+ howToFix: "Open Project Settings \u2192 Tracker connections and click Connect for the missing provider; that switches the project off Melt's shared key onto its own OAuth grant",
1416
+ scope: "project"
1417
+ },
1418
+ {
1419
+ id: "board.empty",
1420
+ dimension: "board",
1421
+ severity: "medium",
1422
+ label: "Board has no open tickets",
1423
+ category: "sprint",
1424
+ howToFix: "Confirm the team is creating stories on the board, or that the mapping is correct",
1425
+ scope: "project"
1426
+ },
1427
+ {
1428
+ id: "board.health-low",
1429
+ dimension: "board",
1430
+ severity: "high",
1431
+ label: "Board health below 40%",
1432
+ category: "sprint",
1433
+ howToFix: "Open the project's Linear board and triage the failing audit checks",
1434
+ scope: "project"
1435
+ },
1384
1436
  {
1385
1437
  id: "board.health-mid",
1386
1438
  dimension: "board",
1387
1439
  severity: "medium",
1388
- label: "Board health 40\u201369%"
1440
+ label: "Board health 40\u201369%",
1441
+ category: "sprint",
1442
+ howToFix: "Open the project's Linear board and triage the failing audit checks",
1443
+ scope: "project"
1444
+ },
1445
+ {
1446
+ id: "board.audit-stale",
1447
+ dimension: "board",
1448
+ severity: "medium",
1449
+ label: "Board audit stale",
1450
+ category: "sprint",
1451
+ howToFix: "Open the project page and click 'Run board audit' to refresh the score",
1452
+ scope: "project"
1453
+ },
1454
+ {
1455
+ id: "board.in-progress-stale",
1456
+ dimension: "board",
1457
+ severity: "medium",
1458
+ label: "Stale in-progress tickets",
1459
+ category: "sprint",
1460
+ howToFix: "Open the project board, ask the assignees what's blocking, and either move the ticket forward or back to the backlog",
1461
+ scope: "project"
1462
+ },
1463
+ {
1464
+ id: "board.pm-silent-critical",
1465
+ dimension: "board",
1466
+ severity: "critical",
1467
+ label: "PM silent in active cycle",
1468
+ category: "sprint",
1469
+ howToFix: "Comment on the active-cycle tickets to acknowledge progress, ask questions, or flag concerns",
1470
+ scope: "project"
1471
+ },
1472
+ {
1473
+ id: "board.pm-silent-medium",
1474
+ dimension: "board",
1475
+ severity: "medium",
1476
+ label: "PM commenting on under 60% of active-cycle tickets",
1477
+ category: "sprint",
1478
+ howToFix: "Comment on the active-cycle tickets to acknowledge progress, ask questions, or flag concerns",
1479
+ scope: "project"
1389
1480
  },
1390
- { id: "board.audit-stale", dimension: "board", severity: "medium", label: "Board audit stale" },
1391
1481
  // Delivery — Risks
1392
1482
  {
1393
1483
  id: "risks.stale-red-zone",
1394
1484
  dimension: "risks",
1395
1485
  severity: "critical",
1396
- label: "Red-zone risk with no recent comment"
1486
+ label: "Red-zone risk with no recent comment",
1487
+ category: "risks",
1488
+ howToFix: "Open the risk in Linear, add a fresh status comment, or close it if resolved",
1489
+ scope: "project"
1397
1490
  },
1398
1491
  {
1399
1492
  id: "risks.active-red-zone",
1400
1493
  dimension: "risks",
1401
1494
  severity: "medium",
1402
- label: "Open red-zone risk"
1495
+ label: "Open red-zone risk",
1496
+ category: "risks",
1497
+ howToFix: "Review the open red-zone risk at this Tuesday's risk review and confirm an owner",
1498
+ scope: "project"
1403
1499
  },
1404
1500
  // Delivery — Activity
1405
1501
  {
1406
- id: "activity.dead",
1502
+ id: "activity.dormant",
1407
1503
  dimension: "activity",
1408
- severity: "high",
1409
- label: "No activity in 21+ days"
1504
+ severity: "medium",
1505
+ label: "No activity in 21+ days",
1506
+ category: "gaps",
1507
+ howToFix: "No meltctl activity in N days \u2014 confirm the project is still active, or mark it on-hold",
1508
+ scope: "project"
1410
1509
  },
1510
+ // Delivery — Plans
1411
1511
  {
1412
- id: "activity.quiet",
1413
- dimension: "activity",
1512
+ id: "plans.stale",
1513
+ dimension: "plans",
1414
1514
  severity: "medium",
1415
- label: "No activity in 10\u201320 days"
1515
+ label: "No recent plan",
1516
+ category: "plans",
1517
+ howToFix: "Remind the team to run `meltctl plan submit` before starting new tickets",
1518
+ scope: "project"
1519
+ },
1520
+ {
1521
+ id: "plans.unscored",
1522
+ dimension: "plans",
1523
+ severity: "low",
1524
+ label: "Plans not yet scored",
1525
+ category: "plans",
1526
+ howToFix: "Open the plan and click 'Score plan' to run the rubric",
1527
+ scope: "project"
1528
+ },
1529
+ {
1530
+ id: "plans.stuck",
1531
+ dimension: "plans",
1532
+ severity: "high",
1533
+ label: "Plan can't be scored",
1534
+ category: "plans",
1535
+ howToFix: "Re-run `meltctl plan submit` with a valid ticket, or close the plan if it's no longer relevant",
1536
+ scope: "project"
1416
1537
  },
1417
- // Delivery — Plans
1418
- { id: "plans.stale", dimension: "plans", severity: "medium", label: "No recent plan" },
1419
1538
  // Delivery — Standups
1420
1539
  {
1421
1540
  id: "standups.low",
1422
1541
  dimension: "standups",
1423
1542
  severity: "medium",
1424
- label: "Standup submission below 50%"
1543
+ label: "Standup submission below 50%",
1544
+ category: "standup",
1545
+ howToFix: "Remind the team that standup is set for 9am Colombia; follow up with non-submitters",
1546
+ scope: "project"
1425
1547
  },
1426
1548
  // Code — Findings
1427
1549
  {
1428
1550
  id: "findings.critical",
1429
1551
  dimension: "findings",
1430
1552
  severity: "critical",
1431
- label: "Critical audit finding"
1553
+ label: "Critical audit finding",
1554
+ category: "audits",
1555
+ howToFix: "Open the audit detail page and address the critical finding before anything else",
1556
+ scope: "project"
1557
+ },
1558
+ {
1559
+ id: "findings.high",
1560
+ dimension: "findings",
1561
+ severity: "high",
1562
+ label: "High audit finding",
1563
+ category: "audits",
1564
+ howToFix: "Open the audit detail page and schedule the high-severity finding into the sprint",
1565
+ scope: "project"
1432
1566
  },
1433
- { id: "findings.high", dimension: "findings", severity: "high", label: "High audit finding" },
1434
1567
  {
1435
1568
  id: "findings.medium",
1436
1569
  dimension: "findings",
1437
1570
  severity: "medium",
1438
- label: "Open audit warnings"
1571
+ label: "Open audit warnings",
1572
+ category: "audits",
1573
+ howToFix: "Open the audit detail page and work through the open warnings/missing checks",
1574
+ scope: "project"
1439
1575
  },
1440
1576
  // Code — Audit coverage
1441
1577
  {
1442
1578
  id: "audit.never",
1443
1579
  dimension: "audit-coverage",
1444
1580
  severity: "medium",
1445
- label: "Never audited"
1581
+ label: "Never audited",
1582
+ category: "audits",
1583
+ howToFix: "Run `/melt-audit` on the repo to create the baseline",
1584
+ scope: "project"
1446
1585
  },
1447
1586
  {
1448
1587
  id: "audit.stale",
1449
1588
  dimension: "audit-coverage",
1450
1589
  severity: "medium",
1451
- label: "Audit over 90 days old"
1590
+ label: "Audit over 90 days old",
1591
+ category: "audits",
1592
+ howToFix: "Run `/melt-audit` on the repo to refresh the baseline",
1593
+ scope: "project"
1452
1594
  },
1453
1595
  {
1454
1596
  id: "audit.partial",
1455
1597
  dimension: "audit-coverage",
1456
1598
  severity: "medium",
1457
- label: "Some repos never audited"
1599
+ label: "Some repos never audited",
1600
+ category: "audits",
1601
+ howToFix: "Run `/melt-audit` on each unaudited repo to create its baseline",
1602
+ scope: "project"
1603
+ },
1604
+ {
1605
+ id: "audit.unprocessed",
1606
+ dimension: "audit-coverage",
1607
+ severity: "low",
1608
+ label: "Audit not processed for findings",
1609
+ category: "audits",
1610
+ howToFix: "Open each audit and click 'Extract findings' to populate the findings table",
1611
+ scope: "project"
1458
1612
  }
1459
1613
  ];
1460
1614
  var RULE_BY_ID = new Map(ISSUE_RULES.map((r) => [r.id, r]));
@@ -1500,20 +1654,17 @@ var SKILL_FRONTMATTER = {
1500
1654
  setup: `---
1501
1655
  user-invocable: true
1502
1656
  description: >-
1503
- Analyze the project and customize AGENTS.md for this codebase.
1504
- Use when setting up a new project, after running meltctl init,
1505
- or when AGENTS.md has placeholder markers. Detects tech stack,
1506
- fills in project-specific sections, and merges existing standards.
1657
+ Analyze the project and customize AGENTS.md for this codebase. Use when
1658
+ setting up a new project, after meltctl init, or when AGENTS.md has
1659
+ placeholder markers.
1507
1660
  ---
1508
1661
 
1509
1662
  `,
1510
1663
  plan: `---
1511
1664
  user-invocable: true
1512
1665
  description: >-
1513
- Design an implementation approach before writing code. Use when
1514
- starting a feature, tackling a complex task, or when the developer
1515
- says "plan this" or "how should we approach this". Gathers requirements,
1516
- explores codebase, and presents a step-by-step plan for approval.
1666
+ Design an implementation approach before writing code. Use when starting
1667
+ a feature, tackling a complex task, or the developer says "plan this".
1517
1668
  ---
1518
1669
 
1519
1670
  `,
@@ -1521,40 +1672,33 @@ description: >-
1521
1672
  user-invocable: true
1522
1673
  description: >-
1523
1674
  Review code changes against project standards and address PR feedback.
1524
- Use when the developer asks to review changes, check code quality,
1525
- or respond to PR reviewer comments. Categorizes findings as must-fix,
1526
- should-fix, or suggestions.
1675
+ Use when the developer asks to review changes or respond to PR reviewer
1676
+ comments.
1527
1677
  ---
1528
1678
 
1529
1679
  `,
1530
1680
  pr: `---
1531
1681
  user-invocable: true
1532
1682
  description: >-
1533
- Create a well-structured pull request from current changes. Use when
1534
- the developer is ready to submit work, says "create a PR", or "open
1535
- a pull request". Analyzes changes, runs pre-flight checks, drafts
1536
- description, and creates the PR via gh CLI.
1683
+ Create a well-structured pull request from current changes. Use when the
1684
+ developer says "create a PR" or is ready to submit work.
1537
1685
  ---
1538
1686
 
1539
1687
  `,
1540
1688
  debug: `---
1541
1689
  user-invocable: true
1542
1690
  description: >-
1543
- Systematically investigate and fix bugs. Use when the developer
1544
- reports a bug, encounters an error, or says "debug this" or "why
1545
- is this failing". Reproduces the issue, isolates root cause, writes
1546
- regression test, and implements minimal fix.
1691
+ Systematically investigate and fix bugs. Use when the developer reports
1692
+ a bug, hits an error, or says "debug this".
1547
1693
  ---
1548
1694
 
1549
1695
  `,
1550
1696
  audit: `---
1551
1697
  user-invocable: true
1552
1698
  description: >-
1553
- Run a comprehensive project compliance audit against team standards.
1554
- Use when the developer wants to assess project health, check compliance,
1555
- or says "audit this project". Checks 15 categories including documentation,
1556
- testing, CI/CD, security, and AI tool setup. Produces a structured
1557
- report with scores and actionable fixes.
1699
+ Run a comprehensive project compliance audit against team standards. Use
1700
+ when the developer wants to assess project health or says "audit this
1701
+ project".
1558
1702
  ---
1559
1703
 
1560
1704
  `,
@@ -1562,31 +1706,25 @@ description: >-
1562
1706
  user-invocable: true
1563
1707
  description: >-
1564
1708
  Review the project's UI against usability heuristics using Chrome DevTools
1565
- MCP. Use when the developer wants to check UX quality, says "review the UI",
1566
- or "UX audit". In full audit mode, crawls the entire app. During an active
1567
- plan, scopes to the current feature and appends results to the plan file.
1709
+ MCP. Use when the developer says "review the UI" or "UX audit".
1568
1710
  ---
1569
1711
 
1570
1712
  `,
1571
1713
  "security-audit": `---
1572
1714
  user-invocable: true
1573
1715
  description: >-
1574
- Run a comprehensive security posture audit across the entire platform.
1575
- Use when the developer wants to assess security, says "security audit",
1576
- or "check our security posture". Covers infrastructure, encryption, auth,
1577
- application security, data protection, CI/CD, and compliance readiness.
1578
- Investigates all platform repositories for a holistic view.
1716
+ Run a comprehensive security posture audit across all platform
1717
+ repositories. Use when the developer says "security audit" or wants to
1718
+ assess security posture.
1579
1719
  ---
1580
1720
 
1581
1721
  `,
1582
1722
  validate: `---
1583
1723
  user-invocable: true
1584
1724
  description: >-
1585
- Run the validation plan from the plan document after implementation.
1586
- Use when the developer says "validate this", "test the feature", or
1587
- after finishing implementation. Validates end-to-end using browser,
1588
- API, or CLI testing, suggests test coverage improvements, then prompts
1589
- the developer for mandatory manual sign-off.
1725
+ Run the validation plan from the plan document after implementation. Use
1726
+ when the developer says "validate this" or "test the feature", or after
1727
+ finishing implementation.
1590
1728
  ---
1591
1729
 
1592
1730
  `,
@@ -1594,9 +1732,7 @@ description: >-
1594
1732
  user-invocable: true
1595
1733
  description: >-
1596
1734
  Update Melt skills and standards to the latest version. Use when the
1597
- developer wants the latest skill templates, says "update melt", or
1598
- after a new meltctl version is released. Fetches latest templates,
1599
- preserves project customizations in AGENTS.md, and merges changes.
1735
+ developer says "update melt" or wants the latest skill templates.
1600
1736
  ---
1601
1737
 
1602
1738
  `,
@@ -1604,9 +1740,8 @@ description: >-
1604
1740
  user-invocable: true
1605
1741
  description: >-
1606
1742
  Answer questions about the AI-First Development Playbook and team
1607
- workflow. Use when the developer asks about the development process,
1608
- what step they're on, how validation works, or any workflow question.
1609
- This is a reference skill \u2014 it explains the process, not executes it.
1743
+ workflow. Use when the developer asks about the development process or
1744
+ how a step works. Reference skill \u2014 explains, doesn't execute.
1610
1745
  ---
1611
1746
 
1612
1747
  `,
@@ -1614,9 +1749,8 @@ description: >-
1614
1749
  user-invocable: true
1615
1750
  description: >-
1616
1751
  Connect and verify required integrations (ticket tracker, browser
1617
- testing). Use after melt-setup, when tools aren't working, or when
1618
- a skill reports missing MCP connections. Guides setup, verifies
1619
- each tool works, and updates AGENTS.md connection status.
1752
+ testing). Use after melt-setup, when tools aren't working, or when a
1753
+ skill reports missing MCP connections.
1620
1754
  ---
1621
1755
 
1622
1756
  `
@@ -3732,10 +3866,6 @@ function createPmResource2(config) {
3732
3866
  const res = await apiFetch2(config, `/pm/project-audit-flags?status=${status}`);
3733
3867
  return unwrap2("list all audit flags", res);
3734
3868
  },
3735
- async dismissAuditFlag(id, reason) {
3736
- const res = await apiFetch2(config, `/pm/project-audit-flags/${id}/dismiss`, { method: "POST", body: JSON.stringify({ reason }) });
3737
- return unwrap2("dismiss audit flag", res);
3738
- },
3739
3869
  async getAuditCatalog() {
3740
3870
  const res = await apiFetch2(config, `/pm/project-audit-catalog`);
3741
3871
  return unwrap2("get audit catalog", res);
@@ -4055,97 +4185,255 @@ var extractionResultSchema2 = z2.object({
4055
4185
  });
4056
4186
  var ISSUE_RULES2 = [
4057
4187
  // Delivery — Roadmap
4058
- { id: "roadmap.none", dimension: "roadmap", severity: "high", label: "No roadmap" },
4188
+ {
4189
+ id: "roadmap.none",
4190
+ dimension: "roadmap",
4191
+ severity: "high",
4192
+ label: "No roadmap",
4193
+ category: "gaps",
4194
+ howToFix: "Open the project's Roadmap tab and add an active phase with at least one planned feature",
4195
+ scope: "project"
4196
+ },
4059
4197
  {
4060
4198
  id: "roadmap.no-active-phase",
4061
4199
  dimension: "roadmap",
4062
4200
  severity: "medium",
4063
- label: "Features but no active phase"
4201
+ label: "Features but no active phase",
4202
+ category: "gaps",
4203
+ howToFix: "Open the Roadmap tab and mark the phase the team is currently working on as active",
4204
+ scope: "project"
4064
4205
  },
4065
4206
  {
4066
4207
  id: "roadmap.empty-phase",
4067
4208
  dimension: "roadmap",
4068
4209
  severity: "medium",
4069
- label: "Active phase is empty"
4210
+ label: "Active phase is empty",
4211
+ category: "gaps",
4212
+ howToFix: "Open the Roadmap tab and attach the phase's planned features, or close the phase if it's done",
4213
+ scope: "project"
4214
+ },
4215
+ {
4216
+ id: "roadmap.no-features-with-active-phase",
4217
+ dimension: "roadmap",
4218
+ severity: "high",
4219
+ label: "Active phase but no features",
4220
+ category: "sprint",
4221
+ howToFix: "Run a backlog-seeding session and add features to the active phase before the team starts",
4222
+ scope: "project"
4070
4223
  },
4071
4224
  // Delivery — Board
4072
- { id: "board.no-mapping", dimension: "board", severity: "high", label: "No board connected" },
4073
- { id: "board.empty", dimension: "board", severity: "medium", label: "Board has no open tickets" },
4074
- { id: "board.health-low", dimension: "board", severity: "high", label: "Board health below 40%" },
4225
+ {
4226
+ id: "board.no-mapping",
4227
+ dimension: "board",
4228
+ severity: "high",
4229
+ label: "No board connected",
4230
+ category: "gaps",
4231
+ howToFix: "Open Project Settings and connect a Linear team or Jira project in the mappings card",
4232
+ scope: "project"
4233
+ },
4234
+ {
4235
+ id: "tracker.no-oauth",
4236
+ dimension: "board",
4237
+ severity: "high",
4238
+ label: "Tracker needs OAuth connect",
4239
+ category: "gaps",
4240
+ howToFix: "Open Project Settings \u2192 Tracker connections and click Connect for the missing provider; that switches the project off Melt's shared key onto its own OAuth grant",
4241
+ scope: "project"
4242
+ },
4243
+ {
4244
+ id: "board.empty",
4245
+ dimension: "board",
4246
+ severity: "medium",
4247
+ label: "Board has no open tickets",
4248
+ category: "sprint",
4249
+ howToFix: "Confirm the team is creating stories on the board, or that the mapping is correct",
4250
+ scope: "project"
4251
+ },
4252
+ {
4253
+ id: "board.health-low",
4254
+ dimension: "board",
4255
+ severity: "high",
4256
+ label: "Board health below 40%",
4257
+ category: "sprint",
4258
+ howToFix: "Open the project's Linear board and triage the failing audit checks",
4259
+ scope: "project"
4260
+ },
4075
4261
  {
4076
4262
  id: "board.health-mid",
4077
4263
  dimension: "board",
4078
4264
  severity: "medium",
4079
- label: "Board health 40\u201369%"
4265
+ label: "Board health 40\u201369%",
4266
+ category: "sprint",
4267
+ howToFix: "Open the project's Linear board and triage the failing audit checks",
4268
+ scope: "project"
4269
+ },
4270
+ {
4271
+ id: "board.audit-stale",
4272
+ dimension: "board",
4273
+ severity: "medium",
4274
+ label: "Board audit stale",
4275
+ category: "sprint",
4276
+ howToFix: "Open the project page and click 'Run board audit' to refresh the score",
4277
+ scope: "project"
4278
+ },
4279
+ {
4280
+ id: "board.in-progress-stale",
4281
+ dimension: "board",
4282
+ severity: "medium",
4283
+ label: "Stale in-progress tickets",
4284
+ category: "sprint",
4285
+ howToFix: "Open the project board, ask the assignees what's blocking, and either move the ticket forward or back to the backlog",
4286
+ scope: "project"
4287
+ },
4288
+ {
4289
+ id: "board.pm-silent-critical",
4290
+ dimension: "board",
4291
+ severity: "critical",
4292
+ label: "PM silent in active cycle",
4293
+ category: "sprint",
4294
+ howToFix: "Comment on the active-cycle tickets to acknowledge progress, ask questions, or flag concerns",
4295
+ scope: "project"
4296
+ },
4297
+ {
4298
+ id: "board.pm-silent-medium",
4299
+ dimension: "board",
4300
+ severity: "medium",
4301
+ label: "PM commenting on under 60% of active-cycle tickets",
4302
+ category: "sprint",
4303
+ howToFix: "Comment on the active-cycle tickets to acknowledge progress, ask questions, or flag concerns",
4304
+ scope: "project"
4080
4305
  },
4081
- { id: "board.audit-stale", dimension: "board", severity: "medium", label: "Board audit stale" },
4082
4306
  // Delivery — Risks
4083
4307
  {
4084
4308
  id: "risks.stale-red-zone",
4085
4309
  dimension: "risks",
4086
4310
  severity: "critical",
4087
- label: "Red-zone risk with no recent comment"
4311
+ label: "Red-zone risk with no recent comment",
4312
+ category: "risks",
4313
+ howToFix: "Open the risk in Linear, add a fresh status comment, or close it if resolved",
4314
+ scope: "project"
4088
4315
  },
4089
4316
  {
4090
4317
  id: "risks.active-red-zone",
4091
4318
  dimension: "risks",
4092
4319
  severity: "medium",
4093
- label: "Open red-zone risk"
4320
+ label: "Open red-zone risk",
4321
+ category: "risks",
4322
+ howToFix: "Review the open red-zone risk at this Tuesday's risk review and confirm an owner",
4323
+ scope: "project"
4094
4324
  },
4095
4325
  // Delivery — Activity
4096
4326
  {
4097
- id: "activity.dead",
4327
+ id: "activity.dormant",
4098
4328
  dimension: "activity",
4099
- severity: "high",
4100
- label: "No activity in 21+ days"
4329
+ severity: "medium",
4330
+ label: "No activity in 21+ days",
4331
+ category: "gaps",
4332
+ howToFix: "No meltctl activity in N days \u2014 confirm the project is still active, or mark it on-hold",
4333
+ scope: "project"
4101
4334
  },
4335
+ // Delivery — Plans
4102
4336
  {
4103
- id: "activity.quiet",
4104
- dimension: "activity",
4337
+ id: "plans.stale",
4338
+ dimension: "plans",
4105
4339
  severity: "medium",
4106
- label: "No activity in 10\u201320 days"
4340
+ label: "No recent plan",
4341
+ category: "plans",
4342
+ howToFix: "Remind the team to run `meltctl plan submit` before starting new tickets",
4343
+ scope: "project"
4344
+ },
4345
+ {
4346
+ id: "plans.unscored",
4347
+ dimension: "plans",
4348
+ severity: "low",
4349
+ label: "Plans not yet scored",
4350
+ category: "plans",
4351
+ howToFix: "Open the plan and click 'Score plan' to run the rubric",
4352
+ scope: "project"
4353
+ },
4354
+ {
4355
+ id: "plans.stuck",
4356
+ dimension: "plans",
4357
+ severity: "high",
4358
+ label: "Plan can't be scored",
4359
+ category: "plans",
4360
+ howToFix: "Re-run `meltctl plan submit` with a valid ticket, or close the plan if it's no longer relevant",
4361
+ scope: "project"
4107
4362
  },
4108
- // Delivery — Plans
4109
- { id: "plans.stale", dimension: "plans", severity: "medium", label: "No recent plan" },
4110
4363
  // Delivery — Standups
4111
4364
  {
4112
4365
  id: "standups.low",
4113
4366
  dimension: "standups",
4114
4367
  severity: "medium",
4115
- label: "Standup submission below 50%"
4368
+ label: "Standup submission below 50%",
4369
+ category: "standup",
4370
+ howToFix: "Remind the team that standup is set for 9am Colombia; follow up with non-submitters",
4371
+ scope: "project"
4116
4372
  },
4117
4373
  // Code — Findings
4118
4374
  {
4119
4375
  id: "findings.critical",
4120
4376
  dimension: "findings",
4121
4377
  severity: "critical",
4122
- label: "Critical audit finding"
4378
+ label: "Critical audit finding",
4379
+ category: "audits",
4380
+ howToFix: "Open the audit detail page and address the critical finding before anything else",
4381
+ scope: "project"
4382
+ },
4383
+ {
4384
+ id: "findings.high",
4385
+ dimension: "findings",
4386
+ severity: "high",
4387
+ label: "High audit finding",
4388
+ category: "audits",
4389
+ howToFix: "Open the audit detail page and schedule the high-severity finding into the sprint",
4390
+ scope: "project"
4123
4391
  },
4124
- { id: "findings.high", dimension: "findings", severity: "high", label: "High audit finding" },
4125
4392
  {
4126
4393
  id: "findings.medium",
4127
4394
  dimension: "findings",
4128
4395
  severity: "medium",
4129
- label: "Open audit warnings"
4396
+ label: "Open audit warnings",
4397
+ category: "audits",
4398
+ howToFix: "Open the audit detail page and work through the open warnings/missing checks",
4399
+ scope: "project"
4130
4400
  },
4131
4401
  // Code — Audit coverage
4132
4402
  {
4133
4403
  id: "audit.never",
4134
4404
  dimension: "audit-coverage",
4135
4405
  severity: "medium",
4136
- label: "Never audited"
4406
+ label: "Never audited",
4407
+ category: "audits",
4408
+ howToFix: "Run `/melt-audit` on the repo to create the baseline",
4409
+ scope: "project"
4137
4410
  },
4138
4411
  {
4139
4412
  id: "audit.stale",
4140
4413
  dimension: "audit-coverage",
4141
4414
  severity: "medium",
4142
- label: "Audit over 90 days old"
4415
+ label: "Audit over 90 days old",
4416
+ category: "audits",
4417
+ howToFix: "Run `/melt-audit` on the repo to refresh the baseline",
4418
+ scope: "project"
4143
4419
  },
4144
4420
  {
4145
4421
  id: "audit.partial",
4146
4422
  dimension: "audit-coverage",
4147
4423
  severity: "medium",
4148
- label: "Some repos never audited"
4424
+ label: "Some repos never audited",
4425
+ category: "audits",
4426
+ howToFix: "Run `/melt-audit` on each unaudited repo to create its baseline",
4427
+ scope: "project"
4428
+ },
4429
+ {
4430
+ id: "audit.unprocessed",
4431
+ dimension: "audit-coverage",
4432
+ severity: "low",
4433
+ label: "Audit not processed for findings",
4434
+ category: "audits",
4435
+ howToFix: "Open each audit and click 'Extract findings' to populate the findings table",
4436
+ scope: "project"
4149
4437
  }
4150
4438
  ];
4151
4439
  var RULE_BY_ID2 = new Map(ISSUE_RULES2.map((r) => [r.id, r]));
@@ -4429,13 +4717,10 @@ function registerFeatureTools(server, getClient2) {
4429
4717
  withClientArgs(getClient2, updateFeature)
4430
4718
  );
4431
4719
  }
4432
- var FLAG_STATUS_VALUES = ["open", "resolved", "dismissed", "all"];
4720
+ var FLAG_STATUS_VALUES = ["open", "resolved", "all"];
4433
4721
  async function listAuditFlags(client, input3) {
4434
4722
  return safe(() => client.pm.listAuditFlags(input3.projectId, input3.status ?? "open"));
4435
4723
  }
4436
- async function dismissAuditFlag(client, input3) {
4437
- return safe(() => client.pm.dismissAuditFlag(input3.flagId, input3.reason));
4438
- }
4439
4724
  async function getAuditCatalog(client) {
4440
4725
  return safe(() => client.pm.getAuditCatalog());
4441
4726
  }
@@ -4446,20 +4731,16 @@ var listAuditFlagsInputSchema = z5.object({
4446
4731
  projectId: z5.number().int().positive(),
4447
4732
  status: z5.enum(FLAG_STATUS_VALUES).optional()
4448
4733
  });
4449
- var dismissAuditFlagInputSchema = z5.object({
4450
- flagId: z5.string().uuid(),
4451
- reason: z5.string().min(1)
4452
- });
4453
4734
  function registerAuditTools(server, getClient2) {
4454
4735
  server.registerTool(
4455
4736
  "list_audit_flags",
4456
4737
  {
4457
4738
  title: "List project audit flags",
4458
- description: "Lists audit flags the nightly cron has raised for a project. Each entry pairs the flag (id, severity, evidence, entity it points at, first/last seen, occurrence count, dismissed-by/reason if applicable) with its catalog entry (human-readable title + description + rule type). Default status='open'; pass 'all' to include resolved + dismissed for context.",
4739
+ description: "Lists audit flags the nightly cron has raised for a project. Each entry pairs the flag (id, severity, evidence, entity it points at, first/last seen, occurrence count) with its catalog entry (human-readable title + description + rule type). Default status='open'; pass 'all' to include resolved flags for context.",
4459
4740
  inputSchema: {
4460
4741
  projectId: z5.number().int().positive(),
4461
4742
  status: z5.enum(FLAG_STATUS_VALUES).optional().describe(
4462
- "Default 'open'. 'resolved' = fixed (flag no longer tripping on latest run). 'dismissed' = PM marked intentionally accepted. 'all' = every flag ever raised on this project."
4743
+ "Default 'open'. 'resolved' = fixed (flag no longer tripping on latest run). 'all' = every flag ever raised on this project."
4463
4744
  )
4464
4745
  }
4465
4746
  },
@@ -4474,20 +4755,6 @@ function registerAuditTools(server, getClient2) {
4474
4755
  },
4475
4756
  withClient(getClient2, getAuditCatalog)
4476
4757
  );
4477
- server.registerTool(
4478
- "dismiss_audit_flag",
4479
- {
4480
- title: "Dismiss audit flag",
4481
- description: "Marks an audit flag as intentionally dismissed with a reason. Use when the PM has reviewed the flag and decided it's a false positive, out of scope, or an accepted trade-off. The reason is stored on the flag + visible in the audit trail; dismissals show up again the next time the flag re-fires unless the underlying rule is retired. This is a write \u2014 confirm with the PM before calling.",
4482
- inputSchema: {
4483
- flagId: z5.string().uuid(),
4484
- reason: z5.string().min(1).describe(
4485
- "Why this flag is being dismissed. Stored verbatim and shown in the audit trail."
4486
- )
4487
- }
4488
- },
4489
- withClientArgs(getClient2, dismissAuditFlag)
4490
- );
4491
4758
  server.registerTool(
4492
4759
  "run_project_audit",
4493
4760
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meltstudio/meltctl",
3
- "version": "4.149.1",
3
+ "version": "4.150.1",
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",