@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.
- package/dist/index.js +396 -129
- 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.
|
|
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
|
-
{
|
|
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
|
-
{
|
|
1382
|
-
|
|
1383
|
-
|
|
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.
|
|
1502
|
+
id: "activity.dormant",
|
|
1407
1503
|
dimension: "activity",
|
|
1408
|
-
severity: "
|
|
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: "
|
|
1413
|
-
dimension: "
|
|
1512
|
+
id: "plans.stale",
|
|
1513
|
+
dimension: "plans",
|
|
1414
1514
|
severity: "medium",
|
|
1415
|
-
label: "No
|
|
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
|
-
|
|
1505
|
-
|
|
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
|
-
|
|
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
|
|
1525
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1555
|
-
|
|
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
|
|
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
|
|
1575
|
-
Use when the developer
|
|
1576
|
-
|
|
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
|
-
|
|
1587
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
{
|
|
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
|
-
{
|
|
4073
|
-
|
|
4074
|
-
|
|
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.
|
|
4327
|
+
id: "activity.dormant",
|
|
4098
4328
|
dimension: "activity",
|
|
4099
|
-
severity: "
|
|
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: "
|
|
4104
|
-
dimension: "
|
|
4337
|
+
id: "plans.stale",
|
|
4338
|
+
dimension: "plans",
|
|
4105
4339
|
severity: "medium",
|
|
4106
|
-
label: "No
|
|
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", "
|
|
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
|
|
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). '
|
|
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