redlinegate 0.0.1 → 0.0.3

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 (86) hide show
  1. package/README.md +23 -7
  2. package/dist/bin/redline.js +338 -43
  3. package/dist/bin/redline.js.map +1 -1
  4. package/dist/commands/init.js +353 -34
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/remove.js +43 -1
  7. package/dist/commands/remove.js.map +1 -1
  8. package/dist/commands/status.js +94 -0
  9. package/dist/commands/status.js.map +1 -0
  10. package/dist/commands/verify.js +82 -2
  11. package/dist/commands/verify.js.map +1 -1
  12. package/dist/config/redline-json.js +63 -2
  13. package/dist/config/redline-json.js.map +1 -1
  14. package/dist/core/git.js +50 -3
  15. package/dist/core/git.js.map +1 -1
  16. package/dist/core/version.js +6 -0
  17. package/dist/core/version.js.map +1 -1
  18. package/dist/detect/existing.js +151 -0
  19. package/dist/detect/existing.js.map +1 -0
  20. package/dist/detect/setup.js +200 -0
  21. package/dist/detect/setup.js.map +1 -0
  22. package/dist/detect/stack.js +56 -17
  23. package/dist/detect/stack.js.map +1 -1
  24. package/dist/exempt/parse.js +8 -1
  25. package/dist/exempt/parse.js.map +1 -1
  26. package/dist/metrics/options.js +0 -9
  27. package/dist/metrics/options.js.map +1 -1
  28. package/dist/platforms/azure/install.js +9 -9
  29. package/dist/platforms/azure/install.js.map +1 -1
  30. package/dist/platforms/azure/verify.js +10 -2
  31. package/dist/platforms/azure/verify.js.map +1 -1
  32. package/dist/platforms/github/install.js +192 -26
  33. package/dist/platforms/github/install.js.map +1 -1
  34. package/dist/platforms/github/preflight.js +63 -0
  35. package/dist/platforms/github/preflight.js.map +1 -0
  36. package/dist/platforms/github/vendor.js +81 -0
  37. package/dist/platforms/github/vendor.js.map +1 -0
  38. package/dist/platforms/github/verify.js +79 -7
  39. package/dist/platforms/github/verify.js.map +1 -1
  40. package/dist/platforms/types.js +8 -0
  41. package/dist/platforms/types.js.map +1 -1
  42. package/dist/policy/diff.js +26 -9
  43. package/dist/policy/diff.js.map +1 -1
  44. package/dist/render/contexts.js +39 -0
  45. package/dist/render/contexts.js.map +1 -0
  46. package/dist/render/profile.js +44 -10
  47. package/dist/render/profile.js.map +1 -1
  48. package/dist/render/standards.js +10 -1
  49. package/dist/render/standards.js.map +1 -1
  50. package/dist/render/vendors.js +14 -53
  51. package/dist/render/vendors.js.map +1 -1
  52. package/dist/rules/catalogue.js +127 -0
  53. package/dist/rules/catalogue.js.map +1 -0
  54. package/dist/ui/facts.js +111 -0
  55. package/dist/ui/facts.js.map +1 -0
  56. package/dist/ui/prompt.js +330 -0
  57. package/dist/ui/prompt.js.map +1 -0
  58. package/dist/ui/report.js +214 -0
  59. package/dist/ui/report.js.map +1 -0
  60. package/dist/ui/tty.js +576 -0
  61. package/dist/ui/tty.js.map +1 -0
  62. package/dist/ui/wizard.js +293 -0
  63. package/dist/ui/wizard.js.map +1 -0
  64. package/dist/verify/remote.js +33 -0
  65. package/dist/verify/remote.js.map +1 -1
  66. package/package.json +13 -1
  67. package/platforms/azure/gate-template-github.yml +152 -0
  68. package/platforms/azure/gate-template.yml +59 -6
  69. package/scripts/check-pins.mjs +84 -1
  70. package/scripts/fetch-stars.mjs +92 -0
  71. package/scripts/lib/rules.d.mts +18 -0
  72. package/scripts/publish-local.mjs +183 -0
  73. package/standards/contexts/speckit.md +22 -0
  74. package/standards/contexts/tmf.md +25 -0
  75. package/standards/manifest.json +78 -7
  76. package/standards/stacks/angular.md +57 -0
  77. package/standards/stacks/dom.md +61 -0
  78. package/standards/stacks/svelte.md +45 -0
  79. package/standards/stacks/vue.md +54 -0
  80. package/templates/redline.yml +9 -9
  81. package/workflows/dashboard.yml +1 -1
  82. package/workflows/redline-collect.yml +1 -1
  83. package/workflows/redline-gate.yml +38 -7
  84. package/workflows/seed-canary.yml +2 -2
  85. package/workflows/weekly-digest.yml +1 -1
  86. package/scripts/measure-context.mjs +0 -101
@@ -1 +1 @@
1
- {"version":3,"file":"vendors.js","sourceRoot":"","sources":["../../cli/render/vendors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vendors.js","sourceRoot":"","sources":["../../cli/render/vendors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AAEjC,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AA6CpD,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAU,EAAE,CACrD,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;AAEtD,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAE,EAAU,EAAU,EAAE,CAC3D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,MAAM,GAAG,CAAC,GAAkB,EAAE,MAAgB,EAAU,EAAE,CAC9D,iBAAiB,GAAG,CAAC,QAAQ,CAAC,OAAO,eAAe,GAAG,CAAC,OAAO,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAEvG,6EAA6E;AAC7E,4EAA4E;AAC5E,wDAAwD;AACxD,MAAM,UAAU,GAAG;IACjB,qDAAqD,gBAAgB,sBAAsB;IAC3F,4FAA4F;IAC5F,mEAAmE;CACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAExD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,UAAU,aAAa,OAAO,UAAU,OAAO,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,GAAkB,EAAE,IAAY,EAAU,EAAE,CAChE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AAE7F,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAE,IAAY,EAAU,EAAE;IAC7D,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AACjG,CAAC,CAAC;AAEF,2EAA2E;AAC3E,gFAAgF;AAChF,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,+EAA+E;AAC/E,gEAAgE;AAChE,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,2EAA2E;AAC3E,oBAAoB;AACpB,MAAM,YAAY,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACjG,MAAM,WAAW,GAAG,IAAI,MAAM,CAC5B,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAChE,IAAI,CACL,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAW,EAAE;IAC9C,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,GAAG,KAAK,KAAK,SAAS,KAAK,GAAG,IAAI,EAAE,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CACrC,IAAI;KACD,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;KACvD,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhB,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CACzB,WAAW,EACX,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,EAAU,EAAE,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAC9F,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,OAAO,GAAmB,CAAC,GAAG,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,KAAK,CAAC,GAAG,CAAC,iCAAiC,EAAE;QAC3C,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;KAClG,CAAC,CAAC;IACH,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,wBAAwB,MAAM,GAAG,EAAE,kBAAkB,EAAE;YAC/D,IAAI,EACF,iBAAiB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW;gBACjE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;SAClD,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,KAAK;QACL,KAAK,EAAE;YACL;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;aACvE;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAE1E,MAAM,MAAM,GAAmB,CAAC,GAAG,EAAE,EAAE;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,oBAAoB,KAAK,GAAG,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG;QACX,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;QACvB,EAAE;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACxC,EAAE;QACF,KAAK;QACL,EAAE;QACF,eAAe;QACf,EAAE;QACF,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;KAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;QACL,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvC,KAAK,EAAE,IAAI,GAAG,CAAC;QACb;YACE,WAAW;YACX;gBACE,KAAK,EAAE,IAAI;gBACX,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,SAAS,CACb,GAAG,EACH;oBACE,mFAAmF;oBACnF,4EAA4E;oBAC5E,EAAE;oBACF,YAAY;iBACb,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;aACF;SACF;KACF,CAAC;IACF,KAAK,EAAE,EAAE;CACV,CAAC,CAAC;AAEH,MAAM,MAAM,GAAmB,CAAC,GAAG,EAAE,EAAE;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,KAAK,CAAC,GAAG,CAAC,iBAAiB,MAAM,UAAU,EAAE;QAC3C,UAAU,EAAE,IAAI;QAChB,IAAI,EACF,sEAAsE;YACtE,SAAS,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;KAC9F,CAAC,CAAC;IACH,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,iBAAiB,MAAM,GAAG,EAAE,MAAM,EAAE;YAC5C,IAAI,EACF,6BAA6B,KAAK,CAAC,KAAK,kBAAkB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;gBACnF,8BAA8B,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;SACrD,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,KAAK;QACL,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;KAC9F,CAAC;AACJ,CAAC,CAAC;AAEF,2EAA2E;AAC3E,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAC/E,wEAAwE;AACxE,qDAAqD;AACrD,MAAM,KAAK,GAAmB,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAmC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { loadManifest } from "../render/manifest.js";
4
+ import { RedlineError } from "../core/errors.js";
5
+ const RULE_LINE = /^-\s+`([a-z0-9][a-z0-9-]*\/[a-z0-9][a-z0-9-]*)`\s+—\s+(.*)$/;
6
+ const RULE_HEADING = /^#{2,3}\s+(BLOCKER|HIGH|SUGGESTION|Security|Type safety|Error handling|General correctness|Scope discipline)\b/i;
7
+ const ANY_HEADING = /^#{1,6}\s/;
8
+ // How a section heading decides the severity of the rules under it. This mirrors
9
+ // scripts/lib/rules.mjs exactly, which is the authority: it is what validate,
10
+ // seed scoring and the telemetry aggregation already use, so a rule's severity
11
+ // here has to be the severity the gate acts on. A stack file heads its sections
12
+ // with the severity word; the core standard groups by topic instead and states
13
+ // the severity in the heading's own text ("## Security (BLOCKER)"), which is why
14
+ // the fallback reads the line rather than the word.
15
+ const SEVERITIES = new Set(['BLOCKER', 'HIGH', 'SUGGESTION']);
16
+ function severityOf(heading, line) {
17
+ const word = heading.toUpperCase();
18
+ if (SEVERITIES.has(word))
19
+ return word;
20
+ return /BLOCKER/i.test(line) ? 'BLOCKER' : 'HIGH';
21
+ }
22
+ /** Every rule the standards define, keyed by id, in source order. */
23
+ export function loadRules(root, manifest = loadManifest(root)) {
24
+ const sources = [
25
+ ['core', manifest.core.source],
26
+ ...Object.entries(manifest.stacks).map(([id, stack]) => [id, stack.source]),
27
+ ];
28
+ const rules = new Map();
29
+ for (const [stack, relPath] of sources) {
30
+ let severity = null;
31
+ let inFence = false;
32
+ readFileSync(join(root, relPath), 'utf8')
33
+ .split('\n')
34
+ .forEach((line, index) => {
35
+ if (/^```/.test(line.trim()))
36
+ inFence = !inFence;
37
+ if (inFence)
38
+ return;
39
+ if (ANY_HEADING.test(line)) {
40
+ const heading = RULE_HEADING.exec(line);
41
+ severity = heading ? severityOf(heading[1], line) : null;
42
+ return;
43
+ }
44
+ const match = RULE_LINE.exec(line);
45
+ if (!match || severity === null)
46
+ return;
47
+ const [, id, text] = match;
48
+ rules.set(id, {
49
+ id: id,
50
+ stack,
51
+ severity,
52
+ text: text.trim(),
53
+ source: relPath,
54
+ line: index + 1,
55
+ });
56
+ });
57
+ }
58
+ return rules;
59
+ }
60
+ /**
61
+ * One rule, with the context a finding does not carry.
62
+ *
63
+ * A finding gives an id and a line. What it cannot say is whether a human or a
64
+ * checker decided it, which files the rule is scoped to, and which repositories
65
+ * in the estate receive it at all — which is exactly what someone asks when
66
+ * they disagree with a finding.
67
+ */
68
+ export function explain(root, id) {
69
+ const manifest = loadManifest(root);
70
+ const rules = loadRules(root, manifest);
71
+ const rule = rules.get(id);
72
+ if (!rule) {
73
+ const near = suggest(id, [...rules.keys()]);
74
+ throw new RedlineError('usage', `no rule "${id}" in the standards`, near.length > 0 ? `did you mean: ${near.join(', ')}` : 'list them with: redline explain --list');
75
+ }
76
+ const profiles = Object.entries(manifest.profiles)
77
+ .filter(([, stacks]) => rule.stack === 'core' || stacks.includes(rule.stack))
78
+ .map(([name]) => name);
79
+ return {
80
+ rule,
81
+ profiles,
82
+ globs: manifest.stacks[rule.stack]?.globs ?? [],
83
+ deterministic: manifest.deterministic.includes(id),
84
+ };
85
+ }
86
+ /**
87
+ * Ids close enough to be what was meant.
88
+ *
89
+ * A mistyped id is the common case — they are copied out of a review comment by
90
+ * hand — and "no such rule" with no candidates makes a typo look like a rule
91
+ * that was removed.
92
+ */
93
+ export function suggest(id, known, limit = 3) {
94
+ const target = id.toLowerCase();
95
+ const [stack, slug] = target.includes('/') ? target.split('/') : [null, target];
96
+ return known
97
+ .map((candidate) => {
98
+ const lower = candidate.toLowerCase();
99
+ const [candStack, candSlug] = lower.split('/');
100
+ let score = 0;
101
+ if (lower === target)
102
+ score += 100;
103
+ if (stack !== null && candStack === stack)
104
+ score += 20;
105
+ if (candSlug === slug)
106
+ score += 40;
107
+ if (slug !== undefined && candSlug !== undefined) {
108
+ if (candSlug.includes(slug) || slug.includes(candSlug))
109
+ score += 15;
110
+ score += shared(candSlug, slug);
111
+ }
112
+ return { candidate, score };
113
+ })
114
+ // Above what a bare stack match scores: sharing a prefix with the typo makes
115
+ // every rule in that stack a candidate, and a list of unrelated rules is
116
+ // worse than no list — it reads as though the tool found something.
117
+ .filter(({ score }) => score > 20)
118
+ .sort((a, b) => b.score - a.score)
119
+ .slice(0, limit)
120
+ .map(({ candidate }) => candidate);
121
+ }
122
+ /** How many hyphen-separated words two slugs have in common. */
123
+ function shared(a, b) {
124
+ const words = new Set(b.split('-'));
125
+ return a.split('-').filter((word) => word.length > 2 && words.has(word)).length * 10;
126
+ }
127
+ //# sourceMappingURL=catalogue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogue.js","sourceRoot":"","sources":["../../cli/rules/catalogue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { readConfig } from "../config/redline-json.js";
4
+ import { OWNING_TEAM } from "../commands/init.js";
5
+ import { surveyRepo } from "../detect/existing.js";
6
+ import { offerable as offerableSetup } from "../detect/setup.js";
7
+ import { resolveProfile } from "../render/profile.js";
8
+ import { proposeProfile } from "../detect/stack.js";
9
+ import { scanRepo } from "../detect/scan.js";
10
+ import { loadManifest } from "../render/manifest.js";
11
+ import { detectVendors } from "../commands/init.js";
12
+ // Everything the menu needs to preselect its answers, gathered from the
13
+ // checkout alone.
14
+ //
15
+ // No host call: the wizard's first question has to appear before a credential
16
+ // is resolved, because `Dry run` is one of its answers and a dry run is
17
+ // precisely the path that must work with no credential at all. Anything that
18
+ // genuinely needs the host — does the reusable gate workflow resolve? — is
19
+ // checked later, on the apply path, where a token exists.
20
+ // Where a repository's own pull request pipeline is likely to live. Matching
21
+ // one only sets the DEFAULT answer to "what runs your checks?", so a wrong
22
+ // guess costs one keystroke; missing a real pipeline is what put a GitHub
23
+ // Actions workflow into a repository gated by Azure Pipelines.
24
+ const PIPELINE_HINTS = [
25
+ 'cicd/pre-merge.yaml',
26
+ 'cicd/pre-merge.yml',
27
+ 'cicd/pr-validation.yaml',
28
+ 'azure-pipelines.yml',
29
+ 'azure-pipelines.yaml',
30
+ '.azuredevops/pre-merge.yml',
31
+ '.pipelines/pre-merge.yml',
32
+ ];
33
+ // A directory of pipeline definitions counts too, but only its pull-request
34
+ // shaped members: `cicd/release.yaml` is not a pull request gate and offering
35
+ // to add a review stage to it would be wrong.
36
+ const PIPELINE_DIRS = ['cicd', '.azuredevops', '.pipelines'];
37
+ const PR_SHAPED = /^(pre-?merge|pr-|pull-?request)/i;
38
+ export function findExistingPipeline(cwd) {
39
+ for (const rel of PIPELINE_HINTS) {
40
+ if (existsSync(join(cwd, rel)))
41
+ return rel;
42
+ }
43
+ for (const dir of PIPELINE_DIRS) {
44
+ const abs = join(cwd, dir);
45
+ if (!existsSync(abs))
46
+ continue;
47
+ let entries;
48
+ try {
49
+ entries = readdirSync(abs);
50
+ }
51
+ catch {
52
+ continue;
53
+ }
54
+ const match = entries.find((name) => /\.ya?ml$/i.test(name) && PR_SHAPED.test(name));
55
+ if (match !== undefined)
56
+ return `${dir}/${match}`;
57
+ }
58
+ return null;
59
+ }
60
+ export function gatherFacts(opts) {
61
+ const { cwd, root } = opts;
62
+ const manifest = loadManifest(root);
63
+ const proposal = proposeProfile(scanRepo(cwd));
64
+ const recorded = readConfig(cwd);
65
+ const survey = surveyRepo(cwd);
66
+ // What could be installed here. The profile is not chosen yet — the menu asks
67
+ // for it after this — so the stacks come from what detection proposed, which
68
+ // is what decides CodeQL's language matrix. A profile chosen against the
69
+ // proposal only ever widens it, and CodeQL on one language too few is a worse
70
+ // failure than the file not being offered.
71
+ let stacks = [];
72
+ try {
73
+ stacks = resolveProfile(manifest, proposal.profile).stacks;
74
+ }
75
+ catch {
76
+ stacks = [];
77
+ }
78
+ const evidenceFor = new Map(survey.tools.map((tool) => [tool.id, tool.evidence]));
79
+ const offerable = offerableSetup(cwd, opts.detectedHost ?? 'github', stacks).map(({ integration }) => ({
80
+ id: integration.id,
81
+ label: integration.label,
82
+ hint: integration.hint,
83
+ ...(evidenceFor.has(integration.id) ? { evidence: evidenceFor.get(integration.id) } : {}),
84
+ }));
85
+ const orgVendors = Object.entries(manifest.vendors)
86
+ .filter(([, vendor]) => vendor.enabled)
87
+ .map(([id]) => id);
88
+ return {
89
+ manifest,
90
+ survey,
91
+ offerable,
92
+ detectedProfile: proposal.profile,
93
+ defaultOwner: `@<org>/${OWNING_TEAM}`,
94
+ detectedConfidence: proposal.confidence,
95
+ profileEvidence: proposal.evidence,
96
+ detectedVendors: detectVendors(cwd, orgVendors),
97
+ detectedHost: opts.detectedHost,
98
+ existingPipeline: findExistingPipeline(cwd),
99
+ recorded: recorded === null
100
+ ? null
101
+ : {
102
+ ...(recorded.profile !== undefined ? { profile: recorded.profile } : {}),
103
+ ...(recorded.vendors !== undefined ? { vendors: recorded.vendors } : {}),
104
+ ...(recorded.rung !== undefined ? { rung: recorded.rung } : {}),
105
+ // Empty means nobody has said, which must fall through to detection
106
+ // rather than record "this repository runs nothing".
107
+ ...(recorded.integrations.length > 0 ? { integrations: recorded.integrations } : {}),
108
+ },
109
+ };
110
+ }
111
+ //# sourceMappingURL=facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.js","sourceRoot":"","sources":["../../cli/ui/facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,330 @@
1
+ import { emitKeypressEvents } from 'node:readline';
2
+ import { answered, colorDepth, colorEnabled, firstEnabled, field, frame, glyphs, intro as introLine, note as noteLine, outro as outroLine, palette, spinner as spinnerLine, spinnerDone, readKey, reduceList, } from "./tty.js";
3
+ // The terminal side of the prompt kit: raw mode, the in-place redraw, and
4
+ // restoring the terminal whatever happens. Everything that decides what a
5
+ // prompt looks like or what a key means lives in tty.ts and is pure.
6
+ //
7
+ // The invariant this file exists to hold: the terminal is left exactly as it
8
+ // was found. Raw mode with a hidden cursor is not a state to leave behind on a
9
+ // crash — the operator's shell would keep echoing nothing until they blind-typed
10
+ // `reset`. Every exit path goes through `restore()`, including the process-level
11
+ // handlers, because a throw from deep inside `init()` unwinds past our `finally`
12
+ // only if we let it.
13
+ /**
14
+ * The operator stopped the run at a prompt.
15
+ *
16
+ * Not a RedlineError: cancelling is not a failure, and it must not print an
17
+ * `error` line or return a failure exit code that a wrapping script would read
18
+ * as "onboarding broke". 130 is the shell convention for SIGINT.
19
+ */
20
+ export class Cancelled extends Error {
21
+ exitCode = 130;
22
+ constructor() {
23
+ super('cancelled');
24
+ this.name = 'Cancelled';
25
+ }
26
+ }
27
+ // Slow enough that the line is readable, fast enough to look alive. Also the
28
+ // interval a non-TTY never pays: there, `task` writes one line and never
29
+ // schedules anything.
30
+ const SPIN_MS = 90;
31
+ /**
32
+ * True when a stepped, redrawing prompt can be shown.
33
+ *
34
+ * Both streams must be a TTY: output alone is not enough (there would be
35
+ * nothing to read keys from) and input alone is not enough (there would be
36
+ * nowhere to draw). CI is excluded even when it allocates a TTY, because a
37
+ * prompt in a pipeline is a hang with no operator to answer it — the failure
38
+ * this whole change exists to remove.
39
+ */
40
+ export function isInteractive(env = process.env, input = process.stdin, output = process.stdout) {
41
+ if (env.CI !== undefined && env.CI !== 'false' && env.CI !== '0')
42
+ return false;
43
+ if (env.REDLINE_NO_PROMPT !== undefined)
44
+ return false;
45
+ if (env.TERM === 'dumb')
46
+ return false;
47
+ return input.isTTY === true && output.isTTY === true;
48
+ }
49
+ const DEFAULT_WIDTH = 80;
50
+ const DEFAULT_HEIGHT = 24;
51
+ // Below this a list is faster to read than to filter, and the letters are worth
52
+ // more as shortcuts: `j`/`k` to move, `a` to take everything.
53
+ const SEARCH_FROM = 9;
54
+ export function createPrompter(opts = {}) {
55
+ const input = opts.input ?? process.stdin;
56
+ const output = opts.output ?? process.stdout;
57
+ const env = opts.env ?? process.env;
58
+ const c = palette(colorEnabled(env, output.isTTY === true), colorDepth(env));
59
+ const g = glyphs(env);
60
+ const write = (text) => {
61
+ output.write(text);
62
+ };
63
+ // Cursor visibility is toggled around a prompt rather than for the whole run:
64
+ // a hidden cursor left behind by a crash is invisible breakage in the
65
+ // operator's next command, not ours.
66
+ const hideCursor = () => write('\x1b[?25l');
67
+ const showCursor = () => write('\x1b[?25h');
68
+ let active = false;
69
+ let restoreHandlers = null;
70
+ const enterRaw = () => {
71
+ emitKeypressEvents(input);
72
+ if (input.isTTY)
73
+ input.setRawMode(true);
74
+ input.resume();
75
+ hideCursor();
76
+ active = true;
77
+ // A signal or an uncaught throw must not leave the terminal in raw mode.
78
+ // These are removed again in exitRaw so a long-lived process (the tests)
79
+ // does not accumulate one pair per prompt.
80
+ const onExit = () => {
81
+ if (active)
82
+ exitRaw();
83
+ };
84
+ process.once('exit', onExit);
85
+ process.once('SIGINT', onExit);
86
+ process.once('SIGTERM', onExit);
87
+ restoreHandlers = () => {
88
+ process.off('exit', onExit);
89
+ process.off('SIGINT', onExit);
90
+ process.off('SIGTERM', onExit);
91
+ };
92
+ };
93
+ const exitRaw = () => {
94
+ active = false;
95
+ showCursor();
96
+ if (input.isTTY)
97
+ input.setRawMode(false);
98
+ input.pause();
99
+ restoreHandlers?.();
100
+ restoreHandlers = null;
101
+ };
102
+ // Rewind exactly the number of lines last drawn, clearing each. Counting our
103
+ // own output rather than asking the terminal is what makes this correct
104
+ // without a cursor-position query — and is why frame() must never emit a
105
+ // line wider than `columns`.
106
+ //
107
+ // Every draw ends with a newline, so the cursor sits on the blank line below
108
+ // the frame, not on its last row: the rewind has to clear that line too or it
109
+ // stops one short and leaves the frame's first line — the title — on screen,
110
+ // once per keypress.
111
+ const erase = (lines) => {
112
+ if (lines === 0)
113
+ return;
114
+ write('\x1b[0G');
115
+ for (let i = 0; i <= lines; i += 1) {
116
+ write('\x1b[2K');
117
+ if (i < lines)
118
+ write('\x1b[1A');
119
+ }
120
+ };
121
+ async function list(title, choices, multi, preselected, cursorAt) {
122
+ if (choices.length === 0)
123
+ return [];
124
+ let state = { cursor: cursorAt, selected: preselected, query: '' };
125
+ const width = output.columns ?? DEFAULT_WIDTH;
126
+ const height = output.rows ?? DEFAULT_HEIGHT;
127
+ // A search field costs a row and is worth one only where rows are not the
128
+ // scarce thing. On a terminal shorter than this the list itself needs every
129
+ // line it can get, and filtering a list you cannot see does not help.
130
+ const search = choices.length >= SEARCH_FROM && height >= 10;
131
+ const render = () => frame({ title, choices, state, multi, palette: c, glyphs: g, width, height, search });
132
+ enterRaw();
133
+ let drawn = render();
134
+ write(`${drawn}\n`);
135
+ try {
136
+ return await new Promise((resolve, reject) => {
137
+ const onData = (chunk) => {
138
+ const key = readKey(chunk.toString());
139
+ if (key === null)
140
+ return;
141
+ const result = reduceList(choices, state, key, { multi, search });
142
+ if (result.kind === 'cancel') {
143
+ cleanup();
144
+ reject(new Cancelled());
145
+ return;
146
+ }
147
+ if (result.kind === 'submit') {
148
+ cleanup();
149
+ const picked = multi
150
+ ? [...state.selected].sort((a, b) => a - b).map((i) => choices[i].value)
151
+ : [choices[state.cursor].value];
152
+ resolve(picked);
153
+ return;
154
+ }
155
+ state = result.state;
156
+ // The redraw rewinds by the line count of what is on screen now,
157
+ // not of what is about to replace it: a prompt whose option list
158
+ // changed length between frames would otherwise leave orphaned rows.
159
+ erase(drawn.split('\n').length);
160
+ drawn = render();
161
+ write(`${drawn}\n`);
162
+ };
163
+ const cleanup = () => {
164
+ input.off('data', onData);
165
+ erase(drawn.split('\n').length);
166
+ exitRaw();
167
+ };
168
+ input.on('data', onData);
169
+ });
170
+ }
171
+ catch (error) {
172
+ // A throw from anywhere above still has to hand the terminal back.
173
+ if (active)
174
+ exitRaw();
175
+ throw error;
176
+ }
177
+ }
178
+ return {
179
+ intro(title) {
180
+ write(`${introLine(title, c, g, output.columns ?? DEFAULT_WIDTH)}\n`);
181
+ },
182
+ async select(title, choices, initial) {
183
+ const at = initial === undefined ? -1 : choices.findIndex((ch) => ch.value === initial);
184
+ const cursor = at >= 0 && choices[at].disabled === undefined ? at : firstEnabled(choices);
185
+ const [picked] = await list(title, choices, false, new Set(), cursor);
186
+ const label = choices.find((ch) => ch.value === picked)?.label ?? String(picked);
187
+ write(`${answered(title, label, c, g)}\n`);
188
+ return picked;
189
+ },
190
+ async multiselect(title, choices, initial = []) {
191
+ // A disabled row can never be toggled (movement skips it), so one that
192
+ // started selected could never be turned off — it would render checked
193
+ // and come back in the answer with no way for the operator to refuse it.
194
+ // A vendor the organisation has switched off is exactly that case, and
195
+ // it is recorded in .redline.json often enough to reach here.
196
+ const selected = new Set(choices.flatMap((ch, i) => ch.disabled === undefined && initial.includes(ch.value) ? [i] : []));
197
+ const picked = await list(title, choices, true, selected, firstEnabled(choices));
198
+ const labels = picked.map((value) => choices.find((ch) => ch.value === value)?.label ?? String(value));
199
+ write(`${answered(title, labels.length > 0 ? labels.join(', ') : 'none', c, g)}\n`);
200
+ return picked;
201
+ },
202
+ async confirm(title, initial = true) {
203
+ const choices = [
204
+ { value: true, label: 'Yes' },
205
+ { value: false, label: 'No' },
206
+ ];
207
+ const [picked] = await list(title, choices, false, new Set(), initial ? 0 : 1);
208
+ write(`${answered(title, picked === true ? 'Yes' : 'No', c, g)}\n`);
209
+ return picked;
210
+ },
211
+ async text(title, opts = {}) {
212
+ const width = output.columns ?? DEFAULT_WIDTH;
213
+ const placeholder = opts.placeholder ?? '';
214
+ const hint = opts.hint ?? '';
215
+ let value = '';
216
+ const render = () => field({ title, value, placeholder, hint, palette: c, glyphs: g, width });
217
+ enterRaw();
218
+ let drawn = render();
219
+ write(`${drawn}\n`);
220
+ try {
221
+ const answer = await new Promise((resolve, reject) => {
222
+ const onData = (chunk) => {
223
+ const key = readKey(chunk.toString());
224
+ if (key === null)
225
+ return;
226
+ if (key === 'cancel') {
227
+ cleanup();
228
+ reject(new Cancelled());
229
+ return;
230
+ }
231
+ if (key === 'enter') {
232
+ cleanup();
233
+ resolve(value.trim());
234
+ return;
235
+ }
236
+ if (key === 'erase')
237
+ value = value.slice(0, -1);
238
+ else if (typeof key === 'object')
239
+ value += key.ch;
240
+ // A space is a space here, not a toggle: this is the one prompt where
241
+ // the list reducer's meaning for it would be wrong.
242
+ else if (key === 'space')
243
+ value += ' ';
244
+ else
245
+ return;
246
+ erase(drawn.split('\n').length);
247
+ drawn = render();
248
+ write(`${drawn}\n`);
249
+ };
250
+ const cleanup = () => {
251
+ input.off('data', onData);
252
+ erase(drawn.split('\n').length);
253
+ exitRaw();
254
+ };
255
+ input.on('data', onData);
256
+ });
257
+ write(`${answered(title, answer === '' ? placeholder : answer, c, g)}\n`);
258
+ return answer;
259
+ }
260
+ catch (error) {
261
+ if (active)
262
+ exitRaw();
263
+ throw error;
264
+ }
265
+ },
266
+ task(label) {
267
+ const width = output.columns ?? DEFAULT_WIDTH;
268
+ let current = label;
269
+ // No TTY, no animation: the frames would arrive as a column of near
270
+ // identical lines in a log file. The label still gets said once, because
271
+ // "what is it doing" is the question even a pipe wants answered.
272
+ if (output.isTTY !== true) {
273
+ write(`${spinnerDone(current, c, g, width)}\n`);
274
+ return {
275
+ update(next) {
276
+ current = next;
277
+ write(`${spinnerDone(next, c, g, width)}\n`);
278
+ },
279
+ done() { },
280
+ stop() { },
281
+ };
282
+ }
283
+ let tick = 0;
284
+ const draw = () => {
285
+ write(`\x1b[0G\x1b[2K${spinnerLine(current, tick, c, g, width)}`);
286
+ };
287
+ hideCursor();
288
+ draw();
289
+ // Unref'd: a timer this owns must never be the reason the process stays
290
+ // alive after the work it was describing has finished.
291
+ const timer = setInterval(() => {
292
+ tick += 1;
293
+ draw();
294
+ }, SPIN_MS);
295
+ timer.unref?.();
296
+ let running = true;
297
+ const halt = () => {
298
+ if (!running)
299
+ return;
300
+ running = false;
301
+ clearInterval(timer);
302
+ write('\x1b[0G\x1b[2K');
303
+ showCursor();
304
+ };
305
+ return {
306
+ update(next) {
307
+ if (!running)
308
+ return;
309
+ current = next;
310
+ draw();
311
+ },
312
+ done(final) {
313
+ if (!running)
314
+ return;
315
+ const last = final ?? current;
316
+ halt();
317
+ write(`${spinnerDone(last, c, g, width)}\n`);
318
+ },
319
+ stop: halt,
320
+ };
321
+ },
322
+ note(message) {
323
+ write(`${noteLine(message, c, g)}\n`);
324
+ },
325
+ outro(message) {
326
+ write(`${outroLine(message, c, g)}\n`);
327
+ },
328
+ };
329
+ }
330
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../cli/ui/prompt.ts"],"names":[],"mappings":"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"}