@mmnto/cli 1.114.0 → 1.116.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 (101) hide show
  1. package/dist/commands/doctor-compliance.test.js +17 -0
  2. package/dist/commands/doctor-compliance.test.js.map +1 -1
  3. package/dist/commands/doctor-seat-identity.d.ts +87 -0
  4. package/dist/commands/doctor-seat-identity.d.ts.map +1 -0
  5. package/dist/commands/doctor-seat-identity.js +427 -0
  6. package/dist/commands/doctor-seat-identity.js.map +1 -0
  7. package/dist/commands/doctor-seat-identity.test.d.ts +13 -0
  8. package/dist/commands/doctor-seat-identity.test.d.ts.map +1 -0
  9. package/dist/commands/doctor-seat-identity.test.js +390 -0
  10. package/dist/commands/doctor-seat-identity.test.js.map +1 -0
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +3 -0
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/doctor.test.js +1 -0
  15. package/dist/commands/doctor.test.js.map +1 -1
  16. package/dist/commands/ecl-gc.d.ts.map +1 -1
  17. package/dist/commands/ecl-gc.js +18 -7
  18. package/dist/commands/ecl-gc.js.map +1 -1
  19. package/dist/commands/ecl-gc.test.js +63 -1
  20. package/dist/commands/ecl-gc.test.js.map +1 -1
  21. package/dist/commands/eject.d.ts +62 -3
  22. package/dist/commands/eject.d.ts.map +1 -1
  23. package/dist/commands/eject.js +382 -47
  24. package/dist/commands/eject.js.map +1 -1
  25. package/dist/commands/eject.test.js +557 -7
  26. package/dist/commands/eject.test.js.map +1 -1
  27. package/dist/commands/gemini-beforetool-contract.test.d.ts +2 -0
  28. package/dist/commands/gemini-beforetool-contract.test.d.ts.map +1 -0
  29. package/dist/commands/gemini-beforetool-contract.test.js +106 -0
  30. package/dist/commands/gemini-beforetool-contract.test.js.map +1 -0
  31. package/dist/commands/gemini-sessionstart-contract.test.d.ts +2 -0
  32. package/dist/commands/gemini-sessionstart-contract.test.d.ts.map +1 -0
  33. package/dist/commands/gemini-sessionstart-contract.test.js +199 -0
  34. package/dist/commands/gemini-sessionstart-contract.test.js.map +1 -0
  35. package/dist/commands/init-templates.d.ts +4 -4
  36. package/dist/commands/init-templates.d.ts.map +1 -1
  37. package/dist/commands/init-templates.js +279 -16
  38. package/dist/commands/init-templates.js.map +1 -1
  39. package/dist/commands/init.test.js +25 -7
  40. package/dist/commands/init.test.js.map +1 -1
  41. package/dist/commands/install-hooks-exit-contract.test.js +5 -0
  42. package/dist/commands/install-hooks-exit-contract.test.js.map +1 -1
  43. package/dist/commands/mail-degraded-e4.test.js +126 -0
  44. package/dist/commands/mail-degraded-e4.test.js.map +1 -1
  45. package/dist/commands/mail.d.ts +19 -1
  46. package/dist/commands/mail.d.ts.map +1 -1
  47. package/dist/commands/mail.js +195 -30
  48. package/dist/commands/mail.js.map +1 -1
  49. package/dist/commands/mail.test.js +291 -3
  50. package/dist/commands/mail.test.js.map +1 -1
  51. package/dist/commands/orient.d.ts.map +1 -1
  52. package/dist/commands/orient.js +82 -0
  53. package/dist/commands/orient.js.map +1 -1
  54. package/dist/commands/orient.test.js +144 -1
  55. package/dist/commands/orient.test.js.map +1 -1
  56. package/dist/commands/retrospect.d.ts.map +1 -1
  57. package/dist/commands/retrospect.js +7 -3
  58. package/dist/commands/retrospect.js.map +1 -1
  59. package/dist/commands/seat-cli-wiring.test.d.ts +20 -0
  60. package/dist/commands/seat-cli-wiring.test.d.ts.map +1 -0
  61. package/dist/commands/seat-cli-wiring.test.js +147 -0
  62. package/dist/commands/seat-cli-wiring.test.js.map +1 -0
  63. package/dist/commands/seat-poll-chain.test.d.ts +13 -0
  64. package/dist/commands/seat-poll-chain.test.d.ts.map +1 -0
  65. package/dist/commands/seat-poll-chain.test.js +103 -0
  66. package/dist/commands/seat-poll-chain.test.js.map +1 -0
  67. package/dist/commands/seat.d.ts +92 -0
  68. package/dist/commands/seat.d.ts.map +1 -0
  69. package/dist/commands/seat.js +649 -0
  70. package/dist/commands/seat.js.map +1 -0
  71. package/dist/commands/seat.test.d.ts +19 -0
  72. package/dist/commands/seat.test.d.ts.map +1 -0
  73. package/dist/commands/seat.test.js +532 -0
  74. package/dist/commands/seat.test.js.map +1 -0
  75. package/dist/commands/sessionstart-manifest-contract.test.d.ts +2 -0
  76. package/dist/commands/sessionstart-manifest-contract.test.d.ts.map +1 -0
  77. package/dist/commands/sessionstart-manifest-contract.test.js +186 -0
  78. package/dist/commands/sessionstart-manifest-contract.test.js.map +1 -0
  79. package/dist/commands/triage-pr.d.ts.map +1 -1
  80. package/dist/commands/triage-pr.js +2 -0
  81. package/dist/commands/triage-pr.js.map +1 -1
  82. package/dist/hooks/__tests__/auto-context.test.js +20 -0
  83. package/dist/hooks/__tests__/auto-context.test.js.map +1 -1
  84. package/dist/hooks/auto-context.d.ts +19 -0
  85. package/dist/hooks/auto-context.d.ts.map +1 -1
  86. package/dist/hooks/auto-context.js +22 -4
  87. package/dist/hooks/auto-context.js.map +1 -1
  88. package/dist/index.js +71 -0
  89. package/dist/index.js.map +1 -1
  90. package/dist/parsers/bot-review-parser.d.ts +8 -1
  91. package/dist/parsers/bot-review-parser.d.ts.map +1 -1
  92. package/dist/parsers/bot-review-parser.js +21 -1
  93. package/dist/parsers/bot-review-parser.js.map +1 -1
  94. package/dist/parsers/bot-review-parser.test.js +23 -0
  95. package/dist/parsers/bot-review-parser.test.js.map +1 -1
  96. package/dist/parsers/triage-severity-mapper.d.ts.map +1 -1
  97. package/dist/parsers/triage-severity-mapper.js +32 -1
  98. package/dist/parsers/triage-severity-mapper.js.map +1 -1
  99. package/dist/parsers/triage-severity-mapper.test.js +57 -0
  100. package/dist/parsers/triage-severity-mapper.test.js.map +1 -1
  101. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"triage-severity-mapper.d.ts","sourceRoot":"","sources":["../../src/parsers/triage-severity-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,UAkB7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAcjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAY/B,CAAC;AAEF,eAAO,MAAM,YAAY,UAcxB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAiBjF"}
1
+ {"version":3,"file":"triage-severity-mapper.d.ts","sourceRoot":"","sources":["../../src/parsers/triage-severity-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,UAkB7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAcjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAY/B,CAAC;AAEF,eAAO,MAAM,YAAY,UAcxB,CAAC;AAsCF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAiBjF"}
@@ -61,6 +61,37 @@ export const NIT_KEYWORDS = [
61
61
  'whitespace',
62
62
  'trailing',
63
63
  ];
64
+ /**
65
+ * Category keyword matching is deliberately ASYMMETRIC by bucket
66
+ * (mmnto-ai/totem#2626, three falsification rounds):
67
+ *
68
+ * - SECURITY / ARCHITECTURE / CONVENTION keep plain substring matching — the
69
+ * long-standing behavior. Their lists carry deliberate stem prefixes
70
+ * ('sanitiz', 'authenticat') whose real hits are letter-joined on EITHER
71
+ * side ("unsanitized", "unauthorized", "sanitized"), and over-matching
72
+ * into a higher-priority bucket cuts the safe way: a finding surfaces too
73
+ * prominently instead of being buried.
74
+ * - NIT requires the keyword to START outside word context. Innocent
75
+ * containments — `nit` inside "defi**nit**ions" (ghcq's stock closing
76
+ * boilerplate, 5 of the 7 real in-org ghcq findings), "u**nit** test",
77
+ * "is_minor_bump" — demoted real findings into the lowest bucket, the
78
+ * unsafe direction. Blocked word-context is letters, numbers, combining
79
+ * marks (NFD text; also VS16-bearing emoji-adjacent tokens), and `_`
80
+ * (snake_case identifiers; also markdown-italic `_nit_` — both false
81
+ * negatives fall in the safe upward direction); real CodeRabbit severity
82
+ * markup keeps a space or emoji before the token (`_🟡 Minor_` — see the
83
+ * `\s*` in parse-nits.ts's severity regex), so it still matches.
84
+ * The trail stays open so inflections keep matching ('nits', 'typos').
85
+ *
86
+ * Net effect vs the pre-#2626 behavior: the NITS bucket only narrows
87
+ * (leading-restriction only ⇒ boundary matches ⊆ substring matches, modulo
88
+ * the `u` flag's Unicode simple case folding on exotic codepoints like
89
+ * U+017F LONG S — practically unreachable in bot prose) and the other three
90
+ * buckets are byte-for-byte unchanged.
91
+ */
92
+ function matchesNitKeyword(text, keywords) {
93
+ return keywords.some((kw) => new RegExp(`(?<![\\p{L}\\p{N}\\p{M}_])${kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`, 'iu').test(text));
94
+ }
64
95
  export function mapToTriageCategory(finding) {
65
96
  // Only search the body for keywords — NOT severity, which would cause
66
97
  // 'minor' severity to match NIT_KEYWORDS and misbucket
@@ -72,7 +103,7 @@ export function mapToTriageCategory(finding) {
72
103
  return 'architecture';
73
104
  if (CONVENTION_KEYWORDS.some((kw) => text.includes(kw)))
74
105
  return 'convention';
75
- if (NIT_KEYWORDS.some((kw) => text.includes(kw)))
106
+ if (matchesNitKeyword(text, NIT_KEYWORDS))
76
107
  return 'nit';
77
108
  // Fall back to bot-assigned severity
78
109
  if (finding.severity === 'critical' || finding.severity === 'high')
@@ -1 +1 @@
1
- {"version":3,"file":"triage-severity-mapper.js","sourceRoot":"","sources":["../../src/parsers/triage-severity-mapper.ts"],"names":[],"mappings":"AAGA,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW;IACX,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,eAAe;IACf,MAAM;IACN,UAAU;IACV,SAAS;IACT,OAAO;IACP,SAAS;IACT,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,aAAa;IACb,YAAY;IACZ,KAAK;IACL,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,UAAU;IACV,UAAU;IACV,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK;IACL,WAAW;IACX,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,YAAY;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,WAAW;IACX,MAAM;IACN,UAAU;IACV,UAAU;IACV,UAAU;IACV,SAAS;IACT,KAAK;IACL,OAAO;IACP,UAAU;IACV,MAAM;IACN,UAAU;IACV,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAExC,2CAA2C;IAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACzE,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC;IACjF,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC7E,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/D,qCAAqC;IACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC;IACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC;IACzF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IAEpF,OAAO,cAAc,CAAC,CAAC,mDAAmD;AAC5E,CAAC"}
1
+ {"version":3,"file":"triage-severity-mapper.js","sourceRoot":"","sources":["../../src/parsers/triage-severity-mapper.ts"],"names":[],"mappings":"AAGA,gDAAgD;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW;IACX,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,eAAe;IACf,MAAM;IACN,UAAU;IACV,SAAS;IACT,OAAO;IACP,SAAS;IACT,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,aAAa;IACb,YAAY;IACZ,KAAK;IACL,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,UAAU;IACV,UAAU;IACV,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK;IACL,WAAW;IACX,QAAQ;IACR,aAAa;IACb,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,YAAY;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,WAAW;IACX,MAAM;IACN,UAAU;IACV,UAAU;IACV,UAAU;IACV,SAAS;IACT,KAAK;IACL,OAAO;IACP,UAAU;IACV,MAAM;IACN,UAAU;IACV,YAAY;IACZ,UAAU;CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,QAA2B;IAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1B,IAAI,MAAM,CAAC,6BAA6B,EAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAC7F,IAAI,CACL,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAExC,2CAA2C;IAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACzE,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC;IACjF,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC7E,IAAI,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAExD,qCAAqC;IACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC;IACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC;IACzF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IAEpF,OAAO,cAAc,CAAC,CAAC,mDAAmD;AAC5E,CAAC"}
@@ -46,6 +46,63 @@ describe('mapToTriageCategory', () => {
46
46
  const finding = makeFinding({ body: 'Trailing whitespace on line 42' });
47
47
  expect(mapToTriageCategory(finding)).toBe('nit');
48
48
  });
49
+ it('the NITS bucket ignores keywords inside word context (mmnto-ai/totem#2626 falsification rounds)', () => {
50
+ // ghcq's stock closing boilerplate contains "defi-nit-ions"; a bare
51
+ // substring match routed 5 of the 7 in-org ghcq findings to NITS. With no
52
+ // other keyword hit, both bodies fall to the architecture default —
53
+ // pinned exactly, not merely not-nit.
54
+ const ghcqBoilerplate = makeFinding({
55
+ tool: 'ghcq',
56
+ body: '## Unused variable\n\nNo imports, new methods, or new definitions are needed.',
57
+ });
58
+ expect(mapToTriageCategory(ghcqBoilerplate)).toBe('architecture');
59
+ // "u-nit test" is the same containment class for every bot.
60
+ const unitTest = makeFinding({ body: 'Missing unit test for the new branch' });
61
+ expect(mapToTriageCategory(unitTest)).toBe('architecture');
62
+ // snake_case identifiers are word context too — `_` is in the blocked
63
+ // class (round-3 catch: "is_minor_bump" bucketed to nit).
64
+ expect(mapToTriageCategory(makeFinding({ body: 'the is_minor_bump flag is never read' }))).toBe('architecture');
65
+ // Non-ASCII letters are word context. Both normalization forms are pinned
66
+ // (round-3 catch: an NFC-only fixture hid the decomposed-form leak — the
67
+ // combining mark U+0308 is neither letter nor number, so \p{M} must be in
68
+ // the blocked class; GitHub does not normalize comment bodies). These two
69
+ // fixture bodies are built via fromCharCode so their source form is
70
+ // deterministic — an editor normalizing a literal NFD body would silently
71
+ // re-hide the leak.
72
+ const nfcBody = String.fromCharCode(0x00fc) + 'nit coverage discussion';
73
+ expect(mapToTriageCategory(makeFinding({ body: nfcBody }))).toBe('architecture');
74
+ const nfdBody = 'u' + String.fromCharCode(0x0308) + 'nit coverage discussion';
75
+ expect(mapToTriageCategory(makeFinding({ body: nfdBody }))).toBe('architecture');
76
+ // Boundary-anchored NIT keywords still match when legitimately present,
77
+ // including CodeRabbit's real severity markup, which keeps a space or
78
+ // emoji before the token (parse-nits.ts `\s*`).
79
+ expect(mapToTriageCategory(makeFinding({ body: 'nit: prefer const here' }))).toBe('nit');
80
+ expect(mapToTriageCategory(makeFinding({ body: 'de quality_ | _🟡 minor_ | _⚡ quick' }))).toBe('nit');
81
+ // Inflections keep matching under the open trail.
82
+ expect(mapToTriageCategory(makeFinding({ body: 'two typos in this paragraph' }))).toBe('nit');
83
+ });
84
+ it('security/architecture/convention keep substring semantics — stems, inflections, negations (rounds 2–3 regression guards)', () => {
85
+ // The security list deliberately carries stems ('sanitiz', 'authenticat');
86
+ // round 2 proved a trailing \b killed every inflection, and round 3 proved
87
+ // a leading boundary killed the negation class — substring keeps both.
88
+ expect(mapToTriageCategory(makeFinding({ body: 'Please sanitize the user input' }))).toBe('security');
89
+ expect(mapToTriageCategory(makeFinding({ body: 'unsanitized input reaches the sink' }))).toBe('security');
90
+ expect(mapToTriageCategory(makeFinding({ body: 'unauthorized access is possible' }))).toBe('security');
91
+ expect(mapToTriageCategory(makeFinding({ body: 'authentication bypass possible' }))).toBe('security');
92
+ // Non-vacuous inflection guard: the body carries a nit-decoy ('Consider')
93
+ // AND a 'minor' severity, so if 'race condition' stops matching inside
94
+ // 'race conditions' the result is 'nit' (keyword path) or 'convention'
95
+ // (severity fallback) — observable either way; only a real architecture
96
+ // keyword hit yields the expected value. (Round-4 catch: with the default
97
+ // 'info' severity, the all-predicates-off mutant fell through to the
98
+ // architecture default and still passed.)
99
+ expect(mapToTriageCategory(makeFinding({ body: 'Consider the race conditions in the write path', severity: 'minor' }))).toBe('architecture');
100
+ // Architecture/convention leading-openness pinned (round-4 catch: this
101
+ // guard's title claimed three buckets but only security could fail):
102
+ // mid-word containments are DELIBERATE matches in these buckets.
103
+ expect(mapToTriageCategory(makeFinding({ body: 'decoupling the parser from the CLI' }))).toBe('architecture');
104
+ expect(mapToTriageCategory(makeFinding({ body: 'renaming this helper would read better' }))).toBe('convention');
105
+ });
49
106
  it('falls back to architecture for unknown findings', () => {
50
107
  const finding = makeFinding({ body: 'Something unusual happened here' });
51
108
  expect(mapToTriageCategory(finding)).toBe('architecture');
@@ -1 +1 @@
1
- {"version":3,"file":"triage-severity-mapper.test.js","sourceRoot":"","sources":["../../src/parsers/triage-severity-mapper.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triage-severity-mapper.test.js","sourceRoot":"","sources":["../../src/parsers/triage-severity-mapper.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,wDAAwD;AAExD,SAAS,WAAW,CAAC,YAA2C,EAAE;IAChE,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,mBAAmB;QACzB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,wDAAwD;AAExD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,4CAA4C,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,IAAI,EAAE,0DAA0D;SACjE,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iGAAiG,EAAE,GAAG,EAAE;QACzG,oEAAoE;QACpE,0EAA0E;QAC1E,oEAAoE;QACpE,sCAAsC;QACtC,MAAM,eAAe,GAAG,WAAW,CAAC;YAClC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,+EAA+E;SACtF,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,sEAAsE;QACtE,0DAA0D;QAC1D,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7F,cAAc,CACf,CAAC;QACF,0EAA0E;QAC1E,yEAAyE;QACzE,0EAA0E;QAC1E,0EAA0E;QAC1E,oEAAoE;QACpE,0EAA0E;QAC1E,oBAAoB;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,yBAAyB,CAAC;QACxE,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,yBAAyB,CAAC;QAC9E,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjF,wEAAwE;QACxE,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzF,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC5F,KAAK,CACN,CAAC;QACF,kDAAkD;QAClD,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0HAA0H,EAAE,GAAG,EAAE;QAClI,2EAA2E;QAC3E,2EAA2E;QAC3E,uEAAuE;QACvE,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CACvF,UAAU,CACX,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC3F,UAAU,CACX,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CACxF,UAAU,CACX,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CACvF,UAAU,CACX,CAAC;QACF,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,0EAA0E;QAC1E,qEAAqE;QACrE,0CAA0C;QAC1C,MAAM,CACJ,mBAAmB,CACjB,WAAW,CAAC,EAAE,IAAI,EAAE,gDAAgD,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAC3F,CACF,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvB,uEAAuE;QACvE,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC3F,cAAc,CACf,CAAC;QACF,MAAM,CACJ,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC,CAAC,CACrF,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/cli",
3
- "version": "1.114.0",
3
+ "version": "1.116.0",
4
4
  "description": "Totem: local-first toolkit that keeps AI-agent work queryable, enforceable, and derivable as plain files in your codebase",
5
5
  "type": "module",
6
6
  "engines": {
@@ -28,7 +28,7 @@
28
28
  "smol-toml": "^1.6.1",
29
29
  "yaml": "^2.4.0",
30
30
  "zod": "^3.24.0",
31
- "@mmnto/totem": "1.114.0"
31
+ "@mmnto/totem": "1.116.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@anthropic-ai/sdk": "^0.98.0",