@reddoorla/maintenance 0.81.0 → 0.82.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 (88) hide show
  1. package/dist/airtable-ZDHLKK5K.js +9 -0
  2. package/dist/{announce-KZDU65IF.js → announce-7QHQGJPV.js} +4 -4
  3. package/dist/{bump-deps-XB2LJTVN.js → bump-deps-ZREAMK7M.js} +2 -2
  4. package/dist/{chunk-JR67FZVC.js → chunk-2BHSGLWR.js} +3 -3
  5. package/dist/{chunk-AKRUYPLU.js → chunk-4PW6ISX7.js} +3 -3
  6. package/dist/{chunk-R5KAXGSP.js → chunk-5E4L7WKE.js} +3 -3
  7. package/dist/{chunk-42A4H6SF.js → chunk-FFI7P74K.js} +2 -2
  8. package/dist/{chunk-3PU2QWOJ.js → chunk-LMCO7CYQ.js} +2 -2
  9. package/dist/{chunk-4BHNP6Y2.js → chunk-ODC4PXZL.js} +2 -2
  10. package/dist/{chunk-SK44IFZN.js → chunk-OIDDJLS7.js} +2 -2
  11. package/dist/{chunk-JMAFXEQE.js → chunk-T4FQ6TZT.js} +6 -3
  12. package/dist/chunk-T4FQ6TZT.js.map +1 -0
  13. package/dist/{chunk-6M2IXJ3E.js → chunk-UH5YPYS4.js} +2 -2
  14. package/dist/{chunk-KKIKJWM2.js → chunk-VXXF4Y25.js} +7 -5
  15. package/dist/chunk-VXXF4Y25.js.map +1 -0
  16. package/dist/{chunk-GXVX4HUH.js → chunk-YRM6EED7.js} +11 -2
  17. package/dist/chunk-YRM6EED7.js.map +1 -0
  18. package/dist/{chunk-TEOENEJH.js → chunk-ZXRRKKMR.js} +2 -2
  19. package/dist/cli/bin.js +21 -21
  20. package/dist/cli/commands/audit.js +6 -6
  21. package/dist/{convert-to-pnpm-FZHSLUQB.js → convert-to-pnpm-UT2R6EOW.js} +2 -2
  22. package/dist/{digest-44QNZZKM.js → digest-CLFUWW62.js} +5 -5
  23. package/dist/{ensure-site-3SOAWTZF.js → ensure-site-LLPOXLWP.js} +2 -2
  24. package/dist/{forms-notify-target-CL3HRVKN.js → forms-notify-target-PN6P3WPW.js} +2 -2
  25. package/dist/{github-signals-2BFMZLPV.js → github-signals-HTH7474O.js} +4 -4
  26. package/dist/{header-image-H4N54DHN.js → header-image-WMHZFU7B.js} +2 -2
  27. package/dist/{health-endpoint-LFVE26QS.js → health-endpoint-4E53ZMLE.js} +2 -2
  28. package/dist/index.d.ts +9 -0
  29. package/dist/index.js +8 -8
  30. package/dist/{init-RYKQFSZI.js → init-3ZJ7Z5NG.js} +4 -4
  31. package/dist/{launch-EGKYS3BD.js → launch-FRCDOB56.js} +6 -6
  32. package/dist/{lighthouse-airtable-ZXNMDEPE.js → lighthouse-airtable-I46QCEIS.js} +3 -3
  33. package/dist/{onboard-RDGHVCNG.js → onboard-45NPDMMW.js} +2 -2
  34. package/dist/{orchestrate-NY6L4Q7Q.js → orchestrate-34JYNIXT.js} +3 -3
  35. package/dist/{preflight-SRDQS7Y6.js → preflight-WVD32COX.js} +4 -4
  36. package/dist/{renovate-dispatch-7D7FMMJP.js → renovate-dispatch-LOOCNZTW.js} +6 -3
  37. package/dist/renovate-dispatch-LOOCNZTW.js.map +1 -0
  38. package/dist/{report-MLCIIML5.js → report-CLF2753O.js} +5 -5
  39. package/dist/{self-updating-WJEHPASK.js → self-updating-5TJ2NB26.js} +2 -2
  40. package/dist/{selftest-ZJDB4JQB.js → selftest-BTCZLCTL.js} +5 -5
  41. package/dist/{smoke-suite-SUEJFBYP.js → smoke-suite-GHKXMKIR.js} +2 -2
  42. package/dist/{submissions-RAYGOASP.js → submissions-KUXLKCSQ.js} +2 -2
  43. package/dist/{svelte-codemods-IWO7X3F3.js → svelte-codemods-YTCTLK7G.js} +2 -2
  44. package/dist/{sync-configs-7XGHFC6P.js → sync-configs-KSSQZU5L.js} +2 -2
  45. package/dist/{upgrade-AM4S7JF3.js → upgrade-UDAPY3SN.js} +2 -2
  46. package/dist/{websites-U6642XSE.js → websites-JXG3WWAU.js} +4 -2
  47. package/dist/{write-audits-to-airtable-22T6D733.js → write-audits-to-airtable-7D3LV4KP.js} +4 -4
  48. package/package.json +3 -3
  49. package/dist/airtable-6L3JD7FY.js +0 -9
  50. package/dist/chunk-GXVX4HUH.js.map +0 -1
  51. package/dist/chunk-JMAFXEQE.js.map +0 -1
  52. package/dist/chunk-KKIKJWM2.js.map +0 -1
  53. package/dist/renovate-dispatch-7D7FMMJP.js.map +0 -1
  54. /package/dist/{airtable-6L3JD7FY.js.map → airtable-ZDHLKK5K.js.map} +0 -0
  55. /package/dist/{announce-KZDU65IF.js.map → announce-7QHQGJPV.js.map} +0 -0
  56. /package/dist/{bump-deps-XB2LJTVN.js.map → bump-deps-ZREAMK7M.js.map} +0 -0
  57. /package/dist/{chunk-JR67FZVC.js.map → chunk-2BHSGLWR.js.map} +0 -0
  58. /package/dist/{chunk-AKRUYPLU.js.map → chunk-4PW6ISX7.js.map} +0 -0
  59. /package/dist/{chunk-R5KAXGSP.js.map → chunk-5E4L7WKE.js.map} +0 -0
  60. /package/dist/{chunk-42A4H6SF.js.map → chunk-FFI7P74K.js.map} +0 -0
  61. /package/dist/{chunk-3PU2QWOJ.js.map → chunk-LMCO7CYQ.js.map} +0 -0
  62. /package/dist/{chunk-4BHNP6Y2.js.map → chunk-ODC4PXZL.js.map} +0 -0
  63. /package/dist/{chunk-SK44IFZN.js.map → chunk-OIDDJLS7.js.map} +0 -0
  64. /package/dist/{chunk-6M2IXJ3E.js.map → chunk-UH5YPYS4.js.map} +0 -0
  65. /package/dist/{chunk-TEOENEJH.js.map → chunk-ZXRRKKMR.js.map} +0 -0
  66. /package/dist/{convert-to-pnpm-FZHSLUQB.js.map → convert-to-pnpm-UT2R6EOW.js.map} +0 -0
  67. /package/dist/{digest-44QNZZKM.js.map → digest-CLFUWW62.js.map} +0 -0
  68. /package/dist/{ensure-site-3SOAWTZF.js.map → ensure-site-LLPOXLWP.js.map} +0 -0
  69. /package/dist/{forms-notify-target-CL3HRVKN.js.map → forms-notify-target-PN6P3WPW.js.map} +0 -0
  70. /package/dist/{github-signals-2BFMZLPV.js.map → github-signals-HTH7474O.js.map} +0 -0
  71. /package/dist/{header-image-H4N54DHN.js.map → header-image-WMHZFU7B.js.map} +0 -0
  72. /package/dist/{health-endpoint-LFVE26QS.js.map → health-endpoint-4E53ZMLE.js.map} +0 -0
  73. /package/dist/{init-RYKQFSZI.js.map → init-3ZJ7Z5NG.js.map} +0 -0
  74. /package/dist/{launch-EGKYS3BD.js.map → launch-FRCDOB56.js.map} +0 -0
  75. /package/dist/{lighthouse-airtable-ZXNMDEPE.js.map → lighthouse-airtable-I46QCEIS.js.map} +0 -0
  76. /package/dist/{onboard-RDGHVCNG.js.map → onboard-45NPDMMW.js.map} +0 -0
  77. /package/dist/{orchestrate-NY6L4Q7Q.js.map → orchestrate-34JYNIXT.js.map} +0 -0
  78. /package/dist/{preflight-SRDQS7Y6.js.map → preflight-WVD32COX.js.map} +0 -0
  79. /package/dist/{report-MLCIIML5.js.map → report-CLF2753O.js.map} +0 -0
  80. /package/dist/{self-updating-WJEHPASK.js.map → self-updating-5TJ2NB26.js.map} +0 -0
  81. /package/dist/{selftest-ZJDB4JQB.js.map → selftest-BTCZLCTL.js.map} +0 -0
  82. /package/dist/{smoke-suite-SUEJFBYP.js.map → smoke-suite-GHKXMKIR.js.map} +0 -0
  83. /package/dist/{submissions-RAYGOASP.js.map → submissions-KUXLKCSQ.js.map} +0 -0
  84. /package/dist/{svelte-codemods-IWO7X3F3.js.map → svelte-codemods-YTCTLK7G.js.map} +0 -0
  85. /package/dist/{sync-configs-7XGHFC6P.js.map → sync-configs-KSSQZU5L.js.map} +0 -0
  86. /package/dist/{upgrade-AM4S7JF3.js.map → upgrade-UDAPY3SN.js.map} +0 -0
  87. /package/dist/{websites-U6642XSE.js.map → websites-JXG3WWAU.js.map} +0 -0
  88. /package/dist/{write-audits-to-airtable-22T6D733.js.map → write-audits-to-airtable-7D3LV4KP.js.map} +0 -0
@@ -3,8 +3,8 @@ import {
3
3
  } from "./chunk-PZQ3WED2.js";
4
4
  import {
5
5
  formatFleetWriteSummary
6
- } from "./chunk-JR67FZVC.js";
7
- import "./chunk-3PU2QWOJ.js";
6
+ } from "./chunk-2BHSGLWR.js";
7
+ import "./chunk-LMCO7CYQ.js";
8
8
  import {
9
9
  detectSignalEvents,
10
10
  fleetSweptEvent
@@ -22,7 +22,7 @@ import {
22
22
  listWebsites,
23
23
  siteSlug,
24
24
  updateGitHubSignals
25
- } from "./chunk-GXVX4HUH.js";
25
+ } from "./chunk-YRM6EED7.js";
26
26
  import {
27
27
  openBase,
28
28
  readAirtableConfig
@@ -134,4 +134,4 @@ export {
134
134
  githubSignalsExitCode,
135
135
  runGitHubSignalsCommand
136
136
  };
137
- //# sourceMappingURL=github-signals-2BFMZLPV.js.map
137
+ //# sourceMappingURL=github-signals-HTH7474O.js.map
@@ -8,7 +8,7 @@ import {
8
8
  ACTIVE_STATUSES,
9
9
  listWebsites,
10
10
  siteSlug
11
- } from "./chunk-GXVX4HUH.js";
11
+ } from "./chunk-YRM6EED7.js";
12
12
  import {
13
13
  openBase,
14
14
  readAirtableConfig
@@ -92,4 +92,4 @@ export {
92
92
  resolveTargets,
93
93
  runHeaderImageCommand
94
94
  };
95
- //# sourceMappingURL=header-image-H4N54DHN.js.map
95
+ //# sourceMappingURL=header-image-WMHZFU7B.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-4NAOR44V.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-4BHNP6Y2.js";
11
+ } from "./chunk-ODC4PXZL.js";
12
12
  import {
13
13
  healthEndpoint
14
14
  } from "./chunk-FX7RAMGC.js";
@@ -51,4 +51,4 @@ async function runHealthEndpointCommand(site, opts) {
51
51
  export {
52
52
  runHealthEndpointCommand
53
53
  };
54
- //# sourceMappingURL=health-endpoint-LFVE26QS.js.map
54
+ //# sourceMappingURL=health-endpoint-4E53ZMLE.js.map
package/dist/index.d.ts CHANGED
@@ -224,6 +224,10 @@ type DependabotAlert = {
224
224
  /** Dependency graph scope, or null when GitHub doesn't classify it. "development" marks a
225
225
  * build-time-only dependency (lower live-exploit surface for a static site). */
226
226
  scope: "runtime" | "development" | null;
227
+ /** Dependency graph relationship (`dependency.relationship`), or null when GitHub reports
228
+ * "unknown"/nothing. "transitive" means no direct-dep bump can fix it — Renovate's vuln
229
+ * alerts have no fix vehicle until the weekly lockfile-maintenance window. */
230
+ relationship: "direct" | "transitive" | null;
227
231
  };
228
232
 
229
233
  /** The Dependabot fetch the security audit needs, injectable for tests. The real default is
@@ -619,6 +623,11 @@ type SecurityAdvisory = {
619
623
  * dashboard flag build-time-only ("development") vulns. Omitted for advisories from the
620
624
  * lockfile `pnpm audit` fallback, which carries no per-package graph scope. */
621
625
  scope?: "runtime" | "development";
626
+ /** GitHub Dependabot dependency-graph relationship, when known. "transitive" means no
627
+ * direct-dep bump can fix it — Renovate's vuln alerts have no fix vehicle until the weekly
628
+ * lockfile-maintenance window. Omitted when GitHub reports "unknown" or for the
629
+ * `pnpm audit` fallback. Drives {@link allActionableVulnsTransitive}. */
630
+ relationship?: "direct" | "transitive";
622
631
  };
623
632
 
624
633
  type ResolvedCopy = {
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import "./chunk-2SLED3NB.js";
2
- import "./chunk-KKIKJWM2.js";
2
+ import "./chunk-VXXF4Y25.js";
3
3
  import {
4
4
  draftReportForSite
5
- } from "./chunk-6M2IXJ3E.js";
5
+ } from "./chunk-UH5YPYS4.js";
6
6
  import "./chunk-62VF32IC.js";
7
7
  import {
8
8
  domainFromUrl,
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-37S6L6G4.js";
12
12
  import {
13
13
  approveBlockers
14
- } from "./chunk-R5KAXGSP.js";
14
+ } from "./chunk-5E4L7WKE.js";
15
15
  import {
16
16
  findDueReports
17
17
  } from "./chunk-D4FVAIEJ.js";
@@ -22,7 +22,7 @@ import {
22
22
  DEFAULT_INIT_STEPS,
23
23
  a11yFixturesPage,
24
24
  init
25
- } from "./chunk-TEOENEJH.js";
25
+ } from "./chunk-ZXRRKKMR.js";
26
26
  import {
27
27
  convertToPnpm
28
28
  } from "./chunk-MGJ72BA4.js";
@@ -42,7 +42,7 @@ import {
42
42
  parseAddresses,
43
43
  sendApprovedReports,
44
44
  withGlobalCc
45
- } from "./chunk-42A4H6SF.js";
45
+ } from "./chunk-FFI7P74K.js";
46
46
  import "./chunk-GECESMVS.js";
47
47
  import {
48
48
  BLURRED_CID,
@@ -78,7 +78,7 @@ import {
78
78
  runAudits,
79
79
  runAuditsAcross,
80
80
  securityAudit
81
- } from "./chunk-JMAFXEQE.js";
81
+ } from "./chunk-T4FQ6TZT.js";
82
82
  import "./chunk-GASBX52O.js";
83
83
  import "./chunk-YAMRVXOD.js";
84
84
  import "./chunk-LKGVSM2O.js";
@@ -98,12 +98,12 @@ import "./chunk-XXTZBPUY.js";
98
98
  import "./chunk-XTK5VIQB.js";
99
99
  import {
100
100
  fromAirtableBase
101
- } from "./chunk-SK44IFZN.js";
101
+ } from "./chunk-OIDDJLS7.js";
102
102
  import "./chunk-U5SZ4FOP.js";
103
103
  import {
104
104
  SEVERITY_RANK,
105
105
  siteSlug
106
- } from "./chunk-GXVX4HUH.js";
106
+ } from "./chunk-YRM6EED7.js";
107
107
  import "./chunk-HN6I2XWI.js";
108
108
  import "./chunk-6VAL7XJT.js";
109
109
  import "./chunk-NMAWXBJA.js";
@@ -5,10 +5,10 @@ import {
5
5
  } from "./chunk-4NAOR44V.js";
6
6
  import {
7
7
  resolveSites
8
- } from "./chunk-4BHNP6Y2.js";
8
+ } from "./chunk-ODC4PXZL.js";
9
9
  import {
10
10
  init
11
- } from "./chunk-TEOENEJH.js";
11
+ } from "./chunk-ZXRRKKMR.js";
12
12
  import "./chunk-MGJ72BA4.js";
13
13
  import "./chunk-LS6QPANO.js";
14
14
  import "./chunk-J7SZQUCW.js";
@@ -20,7 +20,7 @@ import "./chunk-Q276MZ7E.js";
20
20
  import "./chunk-73UFRZKY.js";
21
21
  import "./chunk-ZTPPCHDB.js";
22
22
  import "./chunk-OTGB6YQO.js";
23
- import "./chunk-JMAFXEQE.js";
23
+ import "./chunk-T4FQ6TZT.js";
24
24
  import "./chunk-GASBX52O.js";
25
25
  import "./chunk-YAMRVXOD.js";
26
26
  import "./chunk-LKGVSM2O.js";
@@ -107,4 +107,4 @@ async function runInitCommand(site, opts) {
107
107
  export {
108
108
  runInitCommand
109
109
  };
110
- //# sourceMappingURL=init-RYKQFSZI.js.map
110
+ //# sourceMappingURL=init-3ZJ7Z5NG.js.map
@@ -4,15 +4,15 @@ import {
4
4
  import "./chunk-MNDIED4M.js";
5
5
  import {
6
6
  writeAuditsToAirtable
7
- } from "./chunk-JR67FZVC.js";
7
+ } from "./chunk-2BHSGLWR.js";
8
8
  import {
9
9
  hasRealScores,
10
10
  lighthouseScoresFromResult
11
- } from "./chunk-3PU2QWOJ.js";
11
+ } from "./chunk-LMCO7CYQ.js";
12
12
  import "./chunk-5L3FPQIJ.js";
13
13
  import {
14
14
  resolveSites
15
- } from "./chunk-4BHNP6Y2.js";
15
+ } from "./chunk-ODC4PXZL.js";
16
16
  import {
17
17
  queueDraft
18
18
  } from "./chunk-62VF32IC.js";
@@ -30,7 +30,7 @@ import "./chunk-SEEA6RXF.js";
30
30
  import "./chunk-73UFRZKY.js";
31
31
  import {
32
32
  runAudits
33
- } from "./chunk-JMAFXEQE.js";
33
+ } from "./chunk-T4FQ6TZT.js";
34
34
  import "./chunk-GASBX52O.js";
35
35
  import "./chunk-YAMRVXOD.js";
36
36
  import "./chunk-LKGVSM2O.js";
@@ -46,7 +46,7 @@ import "./chunk-U5SZ4FOP.js";
46
46
  import {
47
47
  listWebsites,
48
48
  siteSlug
49
- } from "./chunk-GXVX4HUH.js";
49
+ } from "./chunk-YRM6EED7.js";
50
50
  import {
51
51
  openBase,
52
52
  readAirtableConfig
@@ -216,4 +216,4 @@ async function runLaunchCommand(site, opts) {
216
216
  export {
217
217
  runLaunchCommand
218
218
  };
219
- //# sourceMappingURL=launch-EGKYS3BD.js.map
219
+ //# sourceMappingURL=launch-FRCDOB56.js.map
@@ -2,11 +2,11 @@ import {
2
2
  hasRealScores,
3
3
  lighthouseScoresFromResult,
4
4
  resolveSlugFromCwd
5
- } from "./chunk-3PU2QWOJ.js";
6
- import "./chunk-GXVX4HUH.js";
5
+ } from "./chunk-LMCO7CYQ.js";
6
+ import "./chunk-YRM6EED7.js";
7
7
  export {
8
8
  hasRealScores,
9
9
  lighthouseScoresFromResult,
10
10
  resolveSlugFromCwd
11
11
  };
12
- //# sourceMappingURL=lighthouse-airtable-ZXNMDEPE.js.map
12
+ //# sourceMappingURL=lighthouse-airtable-I46QCEIS.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-4NAOR44V.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-4BHNP6Y2.js";
11
+ } from "./chunk-ODC4PXZL.js";
12
12
  import {
13
13
  onboard
14
14
  } from "./chunk-NT4WIP7I.js";
@@ -70,4 +70,4 @@ async function runOnboardCommand(site, opts) {
70
70
  export {
71
71
  runOnboardCommand
72
72
  };
73
- //# sourceMappingURL=onboard-RDGHVCNG.js.map
73
+ //# sourceMappingURL=onboard-45NPDMMW.js.map
@@ -4,7 +4,7 @@ import {
4
4
  parseAddresses,
5
5
  sendApprovedReports,
6
6
  withGlobalCc
7
- } from "./chunk-42A4H6SF.js";
7
+ } from "./chunk-FFI7P74K.js";
8
8
  import "./chunk-GECESMVS.js";
9
9
  import "./chunk-6QRLRT3P.js";
10
10
  import "./chunk-MPBXOJ3N.js";
@@ -14,7 +14,7 @@ import "./chunk-QG6OSL4M.js";
14
14
  import "./chunk-DC5H7KEQ.js";
15
15
  import "./chunk-4SOCPK7A.js";
16
16
  import "./chunk-U5SZ4FOP.js";
17
- import "./chunk-GXVX4HUH.js";
17
+ import "./chunk-YRM6EED7.js";
18
18
  import "./chunk-HN6I2XWI.js";
19
19
  import "./chunk-6VAL7XJT.js";
20
20
  export {
@@ -24,4 +24,4 @@ export {
24
24
  sendApprovedReports,
25
25
  withGlobalCc
26
26
  };
27
- //# sourceMappingURL=orchestrate-NY6L4Q7Q.js.map
27
+ //# sourceMappingURL=orchestrate-34JYNIXT.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  preflight
3
- } from "./chunk-R5KAXGSP.js";
3
+ } from "./chunk-5E4L7WKE.js";
4
4
  import "./chunk-D4FVAIEJ.js";
5
- import "./chunk-42A4H6SF.js";
5
+ import "./chunk-FFI7P74K.js";
6
6
  import "./chunk-GECESMVS.js";
7
7
  import "./chunk-6QRLRT3P.js";
8
8
  import "./chunk-MPBXOJ3N.js";
@@ -12,7 +12,7 @@ import "./chunk-QG6OSL4M.js";
12
12
  import "./chunk-DC5H7KEQ.js";
13
13
  import "./chunk-4SOCPK7A.js";
14
14
  import "./chunk-U5SZ4FOP.js";
15
- import "./chunk-GXVX4HUH.js";
15
+ import "./chunk-YRM6EED7.js";
16
16
  import "./chunk-HN6I2XWI.js";
17
17
  import "./chunk-6VAL7XJT.js";
18
18
 
@@ -63,4 +63,4 @@ async function runPreflightCommand(site, opts) {
63
63
  export {
64
64
  runPreflightCommand
65
65
  };
66
- //# sourceMappingURL=preflight-SRDQS7Y6.js.map
66
+ //# sourceMappingURL=preflight-WVD32COX.js.map
@@ -6,10 +6,11 @@ import {
6
6
  } from "./chunk-YAMRVXOD.js";
7
7
  import "./chunk-HVOOCK6L.js";
8
8
  import {
9
+ allActionableVulnsTransitive,
9
10
  isDashboardVisible,
10
11
  listWebsites,
11
12
  updateAutoFixAttempts
12
- } from "./chunk-GXVX4HUH.js";
13
+ } from "./chunk-YRM6EED7.js";
13
14
  import {
14
15
  openBase,
15
16
  readAirtableConfig
@@ -69,7 +70,9 @@ function computeAutoFixAttemptUpdates(sites, result) {
69
70
  if (!isDashboardVisible(s)) continue;
70
71
  const repo = s.gitRepo?.trim();
71
72
  if (!repo) continue;
72
- if (dispatched.has(repo)) updates.push({ id: s.id, attempts: current + 1 });
73
+ if (!dispatched.has(repo)) continue;
74
+ if (allActionableVulnsTransitive(s.securityAdvisories)) continue;
75
+ updates.push({ id: s.id, attempts: current + 1 });
73
76
  }
74
77
  return updates;
75
78
  }
@@ -138,4 +141,4 @@ async function runRenovateDispatchCommand(opts) {
138
141
  export {
139
142
  runRenovateDispatchCommand
140
143
  };
141
- //# sourceMappingURL=renovate-dispatch-7D7FMMJP.js.map
144
+ //# sourceMappingURL=renovate-dispatch-LOOCNZTW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/github/renovate-dispatch.ts","../src/cli/commands/renovate-dispatch.ts"],"sourcesContent":["import {\n allActionableVulnsTransitive,\n isDashboardVisible,\n type WebsiteRow,\n} from \"../reports/airtable/websites.js\";\nimport { isRenovatePR } from \"../alerts/renovate.js\";\nimport type { PullRequestSummary } from \"./gh.js\";\n\n/**\n * On-demand Renovate trigger for fleet sites.\n *\n * The nightly security sweep (`fleet-security.yml`) writes each active site's\n * vulnerability counts to Airtable. This module turns that into action: for the\n * sites the sweep just flagged with *actionable* (critical or high) vulns, it\n * dispatches that repo's `renovate.yml` `workflow_dispatch` so Renovate runs off\n * its twice-daily schedule. Renovate's OSV vulnerability alerts bypass the\n * schedule, so the remediation PR opens immediately — and because GitHub's\n * platform auto-merge is disabled fleet-wide, Renovate merges it from inside that\n * same run (or a later scheduled one) per the shared preset, which is what keeps\n * the preset's \"majors are never auto-merged\" rule authoritative. Moderate/low\n * vulns are left to the normal schedule — not urgent enough to dispatch + churn\n * CI nightly.\n */\n\n/** The per-repo workflow file the fleet uses for its self-hosted Renovate run. */\nexport const RENOVATE_WORKFLOW_FILE = \"renovate.yml\";\n\n/**\n * Does the repo have a HEALTHY open Renovate PR — one that is NOT conflicting?\n *\n * A healthy PR means remediation is genuinely in flight (moving toward merge), so\n * re-dispatching would just churn CI — skip it. A CONFLICTING Renovate PR is STUCK\n * (its branch fell behind the base after another PR merged the same lockfile), so\n * it does NOT count as healthy: re-dispatching triggers Renovate to rebase it.\n * `UNKNOWN` mergeability (GitHub still computing it) is treated as healthy — don't\n * churn on uncertainty. Reuses {@link isRenovatePR} for the branch-prefix check.\n */\nexport function hasHealthyRenovatePr(prs: PullRequestSummary[]): boolean {\n return prs.some((pr) => isRenovatePR(pr) && pr.mergeable !== \"CONFLICTING\");\n}\n\n/** A site selected for an on-demand Renovate run, with the reason (vuln counts). */\nexport type RenovateDispatchTarget = {\n repo: string; // owner/repo, from the Websites \"Git repo\" field\n siteName: string;\n critical: number;\n high: number;\n};\n\n/**\n * Pick the active, repo-backed sites whose latest security sweep found a\n * critical or high vulnerability. A `null` vuln count is treated as zero (a site\n * that was never swept, or had its counts cleared, is not dispatched). Inactive\n * sites and sites without a `Git repo` are excluded — there's nothing to kick.\n *\n * Counts are only guaranteed fresh for sites the sweep actually audited (active +\n * URL present); a site whose write-back failed/was skipped this run is selected on\n * its last-known counts. That's safe — a stale-high false dispatch is an idempotent\n * Renovate no-op, and the open-PR skip in `dispatchRenovateAcross` avoids re-firing\n * when remediation is already in flight.\n */\nexport function selectRenovateTargets(sites: WebsiteRow[]): RenovateDispatchTarget[] {\n const targets: RenovateDispatchTarget[] = [];\n for (const s of sites) {\n if (!isDashboardVisible(s)) continue; // active (maintenance / launch period) only\n const repo = s.gitRepo?.trim();\n if (!repo) continue; // repo-backed only — the dispatch target is its renovate.yml\n const critical = s.securityVulnsCritical ?? 0;\n const high = s.securityVulnsHigh ?? 0;\n if (critical + high <= 0) continue; // actionable (critical/high) vulns only\n targets.push({ repo, siteName: s.name, critical, high });\n }\n return targets;\n}\n\n/** Injected GitHub operations — real ones come from `makeGitHub`, fakes from tests. */\nexport type RenovateDispatchDeps = {\n /** True iff the repo has a HEALTHY (non-conflicting) open Renovate PR —\n * remediation in flight, so don't re-dispatch. A conflicting/stuck PR returns\n * false so the dispatch goes through and Renovate rebases it. */\n hasHealthyOpenRenovatePr: (repo: string) => Promise<boolean>;\n defaultBranch: (repo: string) => Promise<string>;\n dispatch: (repo: string, workflow: string, ref: string) => Promise<void>;\n};\n\nexport type RenovateDispatchResult = {\n dispatched: string[];\n /** Repos skipped because a Renovate PR is already open — no point re-firing. */\n skipped: string[];\n failed: { repo: string; error: string }[];\n};\n\n/**\n * Dispatch `renovate.yml` for each target on its default branch.\n *\n * Skips a repo with a HEALTHY (non-conflicting) open Renovate PR — remediation is\n * in flight, so re-dispatching would just churn CI (keeps a persistent vuln from\n * re-firing every nightly run while its fix PR waits, e.g. a human-gated major\n * bump). A repo whose open Renovate PR is CONFLICTING/stuck is NOT skipped:\n * dispatching triggers Renovate to rebase it. Best-effort and isolated: a repo\n * that lacks `renovate.yml`, or whose\n * dispatch/PR-check is refused (the token's `actions:write` scope), is recorded in\n * `failed` and the rest still run. Never throws — the caller (a follow-up step on\n * the security sweep) must not be able to fail the sweep over a dispatch hiccup.\n */\nexport async function dispatchRenovateAcross(\n targets: RenovateDispatchTarget[],\n deps: RenovateDispatchDeps,\n): Promise<RenovateDispatchResult> {\n const dispatched: string[] = [];\n const skipped: string[] = [];\n const failed: { repo: string; error: string }[] = [];\n for (const t of targets) {\n try {\n if (await deps.hasHealthyOpenRenovatePr(t.repo)) {\n skipped.push(t.repo);\n continue;\n }\n const ref = await deps.defaultBranch(t.repo);\n await deps.dispatch(t.repo, RENOVATE_WORKFLOW_FILE, ref);\n dispatched.push(t.repo);\n } catch (e) {\n failed.push({ repo: t.repo, error: e instanceof Error ? e.message : String(e) });\n }\n }\n return { dispatched, skipped, failed };\n}\n\n/** Machine-readable counts line the workflow greps to annotate partial failures. */\nexport function formatRenovateDispatchSummary(result: RenovateDispatchResult): string {\n return `RENOVATE_DISPATCH_SUMMARY dispatched=${result.dispatched.length} skipped=${result.skipped.length} failed=${result.failed.length}`;\n}\n\n/**\n * Plan the per-site auto-fix-attempt counter writes from a dispatch result. PURE.\n * For each site:\n * - vulns now 0 (or never counted) → reset to 0 (episode resolved)\n * - else dispatched this run → attempts + 1 (a fresh failed-so-far attempt)\n * - else (skipped / failed / untouched) → unchanged\n * The RESET applies fleet-wide — regardless of Status or Git repo — so a site\n * archived or un-repo'd after its episode can't carry a stale counter into its\n * next vuln (Alamo sat at 7 from a long-closed episode). A null vuln count\n * (never-audited) reads as zero, consistent with the existing null-as-zero\n * semantics, so a lingering counter on such a row also clears. The INCREMENT\n * keeps its active + repo-backed filters (only those sites are dispatched).\n * Returns only the rows whose value CHANGES (a steady fleet writes nothing —\n * a 0→0 site emits no write). A skipped repo (healthy Renovate PR in flight) is\n * NOT a failed attempt — a fix is genuinely moving toward merge — so its counter\n * holds. A dispatched site whose critical/high advisories are ALL proven\n * TRANSITIVE also holds: Renovate has no direct-dep bump to open, so the run is a\n * known green no-op waiting on the weekly lockfile window, not a failed fix\n * attempt (Sonder rode 5 such no-ops to a false \"auto-fix failed\", 2026-08-10).\n * Missing/unknown relationship data keeps the increment — never mute on absence.\n */\nexport function computeAutoFixAttemptUpdates(\n sites: WebsiteRow[],\n result: RenovateDispatchResult,\n): { id: string; attempts: number }[] {\n const dispatched = new Set(result.dispatched);\n const updates: { id: string; attempts: number }[] = [];\n for (const s of sites) {\n const current = s.securityAutoFixAttempts ?? 0;\n const vulns = (s.securityVulnsCritical ?? 0) + (s.securityVulnsHigh ?? 0);\n if (vulns === 0) {\n // Episode resolved (or never confirmed): reset REGARDLESS of status/repo —\n // a site archived or un-repo'd after its episode must not carry a stale\n // counter into its next vuln (Alamo sat at 7 from a long-closed episode).\n if (current !== 0) updates.push({ id: s.id, attempts: 0 });\n continue;\n }\n if (!isDashboardVisible(s)) continue; // increments stay active-only\n const repo = s.gitRepo?.trim();\n if (!repo) continue; // …and repo-backed-only\n if (!dispatched.has(repo)) continue;\n // Transitive-only episode: the dispatch can't produce a fix PR (no direct dep\n // to bump) — don't count the no-op as a failed attempt.\n if (allActionableVulnsTransitive(s.securityAdvisories)) continue;\n updates.push({ id: s.id, attempts: current + 1 });\n }\n return updates;\n}\n\n/**\n * Apply the planned counter updates with an injected writer, BEST-EFFORT: a writer\n * that throws (e.g. the Airtable field not yet created, or a transient error) is\n * counted in `failed` and never propagates — the security sweep must not fail over\n * counter bookkeeping. Returns the applied/failed tallies for the summary line.\n */\nexport async function applyAutoFixAttemptUpdates(\n updates: { id: string; attempts: number }[],\n write: (id: string, attempts: number) => Promise<void>,\n): Promise<{ written: number; failed: number }> {\n let written = 0;\n let failed = 0;\n for (const u of updates) {\n try {\n await write(u.id, u.attempts);\n written++;\n } catch {\n failed++;\n }\n }\n return { written, failed };\n}\n\n/** Machine-readable counts line the workflow can grep, mirroring RENOVATE_DISPATCH_SUMMARY. */\nexport function formatAutoFixAttemptsSummary(tally: { written: number; failed: number }): string {\n return `AUTO_FIX_ATTEMPTS_SUMMARY written=${tally.written} failed=${tally.failed}`;\n}\n","import { openBase, readAirtableConfig, type AirtableBase } from \"../../reports/airtable/client.js\";\nimport { listWebsites, updateAutoFixAttempts } from \"../../reports/airtable/websites.js\";\nimport { makeGitHub } from \"../../github/gh.js\";\nimport {\n selectRenovateTargets,\n dispatchRenovateAcross,\n formatRenovateDispatchSummary,\n hasHealthyRenovatePr,\n computeAutoFixAttemptUpdates,\n applyAutoFixAttemptUpdates,\n formatAutoFixAttemptsSummary,\n type RenovateDispatchResult,\n} from \"../../github/renovate-dispatch.js\";\n\n/**\n * `renovate-dispatch --fleet`: read the Websites table, pick the active,\n * repo-backed sites the latest security sweep flagged with critical/high vulns,\n * and fire each one's `renovate.yml` `workflow_dispatch` so Renovate's OSV\n * vulnerability alerts open the remediation PR now (instead of waiting for the\n * weekly schedule). Designed to run as a best-effort follow-up step on\n * `fleet-security.yml` AFTER the sweep has written fresh counts to Airtable.\n *\n * Always exits 0: a missing token is a clean skip; a partial dispatch failure\n * (a repo without `renovate.yml`, or a token lacking `actions:write`) is reported\n * in the summary for the workflow to annotate, never failing the security sweep.\n */\nexport async function runRenovateDispatchCommand(opts: {\n fleet?: boolean | undefined;\n /** Inject a pre-opened Airtable base (tests). Defaults to env config. */\n base?: AirtableBase;\n}): Promise<{ output: string; code: number }> {\n if (!opts.fleet) {\n return { output: \"renovate-dispatch currently supports only --fleet\", code: 2 };\n }\n const token = process.env.RENOVATE_TOKEN?.trim() || process.env.GH_TOKEN?.trim();\n if (!token) {\n return {\n output: \"renovate-dispatch skipped: no RENOVATE_TOKEN/GH_TOKEN (fleet dispatch) configured.\",\n code: 0,\n };\n }\n\n const base = opts.base ?? openBase(readAirtableConfig());\n const websites = await listWebsites(base);\n const targets = selectRenovateTargets(websites);\n\n const lines: string[] = [];\n let result: RenovateDispatchResult = { dispatched: [], skipped: [], failed: [] };\n if (targets.length === 0) {\n lines.push(\n \"No active repo-backed sites with critical/high vulnerabilities — nothing to dispatch.\",\n );\n } else {\n const gh = makeGitHub({ token });\n result = await dispatchRenovateAcross(targets, {\n hasHealthyOpenRenovatePr: async (repo) =>\n hasHealthyRenovatePr(await gh.openPullRequests(repo)),\n defaultBranch: (repo) => gh.defaultBranch(repo),\n dispatch: (repo, workflow, ref) => gh.dispatchWorkflow(repo, workflow, ref),\n });\n\n const failedRepos = new Set(result.failed.map((f) => f.repo));\n const skippedRepos = new Set(result.skipped);\n for (const t of targets) {\n const status = failedRepos.has(t.repo)\n ? \"FAILED \"\n : skippedRepos.has(t.repo)\n ? \"skipped (open Renovate PR) \"\n : \"dispatched \";\n lines.push(`${status} ${t.repo} (critical=${t.critical} high=${t.high}) — ${t.siteName}`);\n }\n for (const f of result.failed) lines.push(` ↳ ${f.repo}: ${f.error}`);\n }\n\n // Counter bookkeeping runs on EVERY fleet run — the reset-on-clean branch was\n // previously unreachable behind the zero-targets early return, so a fully-clean\n // fleet never cleared stale counters (Alamo stuck at 7, 2026-07). Best-effort:\n // a failed write is tallied, never thrown. Uses the full `websites` list so\n // 0-vuln sites reset.\n const attemptUpdates = computeAutoFixAttemptUpdates(websites, result);\n const attemptTally = await applyAutoFixAttemptUpdates(attemptUpdates, (id, attempts) =>\n updateAutoFixAttempts(base, id, attempts),\n );\n\n lines.push(formatRenovateDispatchSummary(result));\n lines.push(formatAutoFixAttemptsSummary(attemptTally));\n\n return { output: lines.join(\"\\n\"), code: 0 };\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  draftReportForSite,
3
3
  readGaConfig
4
- } from "./chunk-6M2IXJ3E.js";
4
+ } from "./chunk-UH5YPYS4.js";
5
5
  import {
6
6
  reportTier
7
7
  } from "./chunk-62VF32IC.js";
@@ -23,7 +23,7 @@ import {
23
23
  listWebsites,
24
24
  siteSlug,
25
25
  updateNextDueDates
26
- } from "./chunk-GXVX4HUH.js";
26
+ } from "./chunk-YRM6EED7.js";
27
27
  import {
28
28
  openBase,
29
29
  readAirtableConfig
@@ -73,11 +73,11 @@ function dashboardBaseUrl() {
73
73
  }
74
74
  async function runReportCommand(slug, opts) {
75
75
  if (opts.digest) {
76
- const { runDigest } = await import("./digest-44QNZZKM.js");
76
+ const { runDigest } = await import("./digest-CLFUWW62.js");
77
77
  return runDigest({ baseUrl: dashboardBaseUrl() });
78
78
  }
79
79
  if (opts.sendReady) {
80
- const { sendApprovedReports } = await import("./orchestrate-NY6L4Q7Q.js");
80
+ const { sendApprovedReports } = await import("./orchestrate-34JYNIXT.js");
81
81
  return sendApprovedReports();
82
82
  }
83
83
  if (opts.due) {
@@ -272,4 +272,4 @@ export {
272
272
  parseSingleSiteReportType,
273
273
  runReportCommand
274
274
  };
275
- //# sourceMappingURL=report-MLCIIML5.js.map
275
+ //# sourceMappingURL=report-CLF2753O.js.map
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-4NAOR44V.js";
13
13
  import {
14
14
  resolveSites
15
- } from "./chunk-4BHNP6Y2.js";
15
+ } from "./chunk-ODC4PXZL.js";
16
16
  import "./chunk-73UFRZKY.js";
17
17
  import "./chunk-GASBX52O.js";
18
18
  import "./chunk-YAMRVXOD.js";
@@ -62,4 +62,4 @@ async function runSelfUpdatingCommand(site, opts) {
62
62
  export {
63
63
  runSelfUpdatingCommand
64
64
  };
65
- //# sourceMappingURL=self-updating-WJEHPASK.js.map
65
+ //# sourceMappingURL=self-updating-5TJ2NB26.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildReportDataForSite,
3
3
  scoresFromRow
4
- } from "./chunk-AKRUYPLU.js";
5
- import "./chunk-6M2IXJ3E.js";
4
+ } from "./chunk-4PW6ISX7.js";
5
+ import "./chunk-UH5YPYS4.js";
6
6
  import "./chunk-62VF32IC.js";
7
7
  import "./chunk-37S6L6G4.js";
8
8
  import {
@@ -13,7 +13,7 @@ import {
13
13
  parseAddresses,
14
14
  prepareHeaderImage,
15
15
  renderReportEmail
16
- } from "./chunk-42A4H6SF.js";
16
+ } from "./chunk-FFI7P74K.js";
17
17
  import "./chunk-GECESMVS.js";
18
18
  import "./chunk-6QRLRT3P.js";
19
19
  import {
@@ -30,7 +30,7 @@ import "./chunk-U5SZ4FOP.js";
30
30
  import {
31
31
  listWebsites,
32
32
  siteSlug
33
- } from "./chunk-GXVX4HUH.js";
33
+ } from "./chunk-YRM6EED7.js";
34
34
  import {
35
35
  openBase,
36
36
  readAirtableConfig
@@ -162,4 +162,4 @@ async function runSelftestCommand(kind, site, opts) {
162
162
  export {
163
163
  runSelftestCommand
164
164
  };
165
- //# sourceMappingURL=selftest-ZJDB4JQB.js.map
165
+ //# sourceMappingURL=selftest-BTCZLCTL.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-4NAOR44V.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-4BHNP6Y2.js";
11
+ } from "./chunk-ODC4PXZL.js";
12
12
  import {
13
13
  smokeSuite
14
14
  } from "./chunk-K5JZ5KLO.js";
@@ -51,4 +51,4 @@ async function runSmokeSuiteCommand(site, opts) {
51
51
  export {
52
52
  runSmokeSuiteCommand
53
53
  };
54
- //# sourceMappingURL=smoke-suite-SUEJFBYP.js.map
54
+ //# sourceMappingURL=smoke-suite-GHKXMKIR.js.map
@@ -41,7 +41,7 @@ async function rescoreNewSubmissions(db, opts) {
41
41
  async function loadSiteNames() {
42
42
  try {
43
43
  const { openBase, readAirtableConfig } = await import("./client-EPVO3FEH.js");
44
- const { listWebsites } = await import("./websites-U6642XSE.js");
44
+ const { listWebsites } = await import("./websites-JXG3WWAU.js");
45
45
  const sites = await listWebsites(openBase(readAirtableConfig()));
46
46
  return new Map(sites.map((s) => [s.id, s.name]));
47
47
  } catch (err) {
@@ -119,4 +119,4 @@ export {
119
119
  rescoreNewSubmissions,
120
120
  runSubmissionsCommand
121
121
  };
122
- //# sourceMappingURL=submissions-RAYGOASP.js.map
122
+ //# sourceMappingURL=submissions-KUXLKCSQ.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-4NAOR44V.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-4BHNP6Y2.js";
11
+ } from "./chunk-ODC4PXZL.js";
12
12
  import {
13
13
  svelteCodemods
14
14
  } from "./chunk-LS6QPANO.js";
@@ -51,4 +51,4 @@ async function runSvelteCodemodsCommand(site, opts) {
51
51
  export {
52
52
  runSvelteCodemodsCommand
53
53
  };
54
- //# sourceMappingURL=svelte-codemods-IWO7X3F3.js.map
54
+ //# sourceMappingURL=svelte-codemods-YTCTLK7G.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-4NAOR44V.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-4BHNP6Y2.js";
11
+ } from "./chunk-ODC4PXZL.js";
12
12
  import {
13
13
  ALL_CONFIG_NAMES,
14
14
  CANONICAL_GITIGNORE_ENTRIES,
@@ -113,4 +113,4 @@ async function runSyncConfigsCommand(site, opts) {
113
113
  export {
114
114
  runSyncConfigsCommand
115
115
  };
116
- //# sourceMappingURL=sync-configs-7XGHFC6P.js.map
116
+ //# sourceMappingURL=sync-configs-KSSQZU5L.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-4NAOR44V.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-4BHNP6Y2.js";
11
+ } from "./chunk-ODC4PXZL.js";
12
12
  import {
13
13
  upgradeSvelte4to5
14
14
  } from "./chunk-B5ZUQZFL.js";
@@ -60,4 +60,4 @@ async function runUpgradeCommand(upgradeName, site, opts = {}) {
60
60
  export {
61
61
  runUpgradeCommand
62
62
  };
63
- //# sourceMappingURL=upgrade-AM4S7JF3.js.map
63
+ //# sourceMappingURL=upgrade-UDAPY3SN.js.map
@@ -5,6 +5,7 @@ import {
5
5
  PRE_LAUNCH_STATUSES,
6
6
  SEVERITY_RANK,
7
7
  WEBSITES_TABLE,
8
+ allActionableVulnsTransitive,
8
9
  getWebsiteBySlug,
9
10
  isArchivedStatus,
10
11
  isDashboardVisible,
@@ -28,7 +29,7 @@ import {
28
29
  updateScores,
29
30
  updateSecurityCounts,
30
31
  updateSiteField
31
- } from "./chunk-GXVX4HUH.js";
32
+ } from "./chunk-YRM6EED7.js";
32
33
  export {
33
34
  ACTIVE_STATUSES,
34
35
  ARCHIVED_STATUSES,
@@ -36,6 +37,7 @@ export {
36
37
  PRE_LAUNCH_STATUSES,
37
38
  SEVERITY_RANK,
38
39
  WEBSITES_TABLE,
40
+ allActionableVulnsTransitive,
39
41
  getWebsiteBySlug,
40
42
  isArchivedStatus,
41
43
  isDashboardVisible,
@@ -60,4 +62,4 @@ export {
60
62
  updateSecurityCounts,
61
63
  updateSiteField
62
64
  };
63
- //# sourceMappingURL=websites-U6642XSE.js.map
65
+ //# sourceMappingURL=websites-JXG3WWAU.js.map
@@ -2,13 +2,13 @@ import {
2
2
  formatFleetWriteSummary,
3
3
  writeAuditsToAirtable,
4
4
  writeFleetAuditsToAirtable
5
- } from "./chunk-JR67FZVC.js";
6
- import "./chunk-3PU2QWOJ.js";
5
+ } from "./chunk-2BHSGLWR.js";
6
+ import "./chunk-LMCO7CYQ.js";
7
7
  import "./chunk-5L3FPQIJ.js";
8
- import "./chunk-GXVX4HUH.js";
8
+ import "./chunk-YRM6EED7.js";
9
9
  export {
10
10
  formatFleetWriteSummary,
11
11
  writeAuditsToAirtable,
12
12
  writeFleetAuditsToAirtable
13
13
  };
14
- //# sourceMappingURL=write-audits-to-airtable-22T6D733.js.map
14
+ //# sourceMappingURL=write-audits-to-airtable-7D3LV4KP.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reddoorla/maintenance",
3
- "version": "0.81.0",
3
+ "version": "0.82.0",
4
4
  "description": "Canonical maintenance configs, audits, and recipes for the reddoor stack.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -65,7 +65,7 @@
65
65
  "listr2": "^10.2.1",
66
66
  "node-html-parser": "^9.0.0",
67
67
  "prettier": "^3.1.1",
68
- "prettier-plugin-svelte": "^3.2.6",
68
+ "prettier-plugin-svelte": "^4.0.0",
69
69
  "tinyglobby": "^0.2.10",
70
70
  "typescript-eslint": "^8.59.1"
71
71
  },
@@ -79,7 +79,7 @@
79
79
  },
80
80
  "devDependencies": {
81
81
  "@changesets/cli": "^2.31.0",
82
- "@google-analytics/data": "^6.1.0",
82
+ "@google-analytics/data": "^7.0.0",
83
83
  "@lhci/cli": "^0.15.1",
84
84
  "@libsql/client": "^0.8.1",
85
85
  "@libsql/kysely-libsql": "^0.4.1",
@@ -1,9 +0,0 @@
1
- import {
2
- fromAirtableBase
3
- } from "./chunk-SK44IFZN.js";
4
- import "./chunk-U5SZ4FOP.js";
5
- import "./chunk-GXVX4HUH.js";
6
- export {
7
- fromAirtableBase
8
- };
9
- //# sourceMappingURL=airtable-6L3JD7FY.js.map