github-reporadar 0.7.0 → 0.9.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.
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:"IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, "SF Mono", Menlo, monospace;--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-500:oklch(68.5% .169 237.323);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-ink:#0a0c10;--color-panel:#13171e;--color-panel-2:#0d1015;--color-line:#262d3a;--color-line-strong:#5d6779;--color-fg:#f2f4f8;--color-fg-muted:#a3acbd;--color-fg-faint:#858e9f}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{color-scheme:dark}html,body,#root{height:100%}body{font-family:var(--font-sans);background-color:var(--color-ink);color:var(--color-fg);-webkit-font-smoothing:antialiased}body:before{content:"";pointer-events:none;background:radial-gradient(58% 42% at 80% -6%,#10b98112,#0000 70%);position:fixed;top:0;right:0;bottom:0;left:0}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.top-0{top:0}.z-10{z-index:10}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-6{height:calc(var(--spacing) * 6)}.h-full{height:100%}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[calc\(100vh-5rem\)\]{max-height:calc(100vh - 5rem)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-6{width:calc(var(--spacing) * 6)}.w-11{width:calc(var(--spacing) * 11)}.w-14{width:calc(var(--spacing) * 14)}.w-48{width:calc(var(--spacing) * 48)}.w-64{width:calc(var(--spacing) * 64)}.w-\[min\(28rem\,calc\(100vw-1rem\)\)\]{width:min(28rem,100vw - 1rem)}.w-\[min\(30rem\,calc\(100vw-1rem\)\)\]{width:min(30rem,100vw - 1rem)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[60\%\]{max-width:60%}.max-w-\[Nch\]{max-width:Nch}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-44{min-width:calc(var(--spacing) * 44)}.min-w-\[220px\]{min-width:220px}.min-w-\[240px\]{min-width:240px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.grid-cols-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-columns:auto minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line\/60>:not(:last-child)){border-color:#262d3a99}@supports (color:color-mix(in lab,red,red)){:where(.divide-line\/60>:not(:last-child)){border-color:color-mix(in oklab,var(--color-line) 60%,transparent)}}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-\[\#\.\.\]{border-color:#..}.border-amber-500\/25{border-color:#f99c0040}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/25{border-color:color-mix(in oklab,var(--color-amber-500) 25%,transparent)}}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500) 40%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-emerald-500\/40{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/40{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.border-emerald-500\/50{border-color:#00bb7f80}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/50{border-color:color-mix(in oklab,var(--color-emerald-500) 50%,transparent)}}.border-emerald-500\/60{border-color:#00bb7f99}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/60{border-color:color-mix(in oklab,var(--color-emerald-500) 60%,transparent)}}.border-line{border-color:var(--color-line)}.border-line-strong{border-color:var(--color-line-strong)}.border-line\/60{border-color:#262d3a99}@supports (color:color-mix(in lab,red,red)){.border-line\/60{border-color:color-mix(in oklab,var(--color-line) 60%,transparent)}}.border-rose-500\/40{border-color:#ff235766}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/40{border-color:color-mix(in oklab,var(--color-rose-500) 40%,transparent)}}.bg-\[\#\.\.\]{background-color:#..}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-400\/15{background-color:#fcbb0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-400\/15{background-color:color-mix(in oklab,var(--color-amber-400) 15%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/\[0\.07\]{background-color:#f99c0012}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/\[0\.07\]{background-color:color-mix(in oklab,var(--color-amber-500) 7%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-400\/10{background-color:#00d2941a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-400\/10{background-color:color-mix(in oklab,var(--color-emerald-400) 10%,transparent)}}.bg-emerald-400\/\[0\.04\]{background-color:#00d2940a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-400\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-emerald-400) 4%,transparent)}}.bg-emerald-400\/\[0\.06\]{background-color:#00d2940f}@supports (color:color-mix(in lab,red,red)){.bg-emerald-400\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-emerald-400) 6%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-ink{background-color:var(--color-ink)}.bg-ink\/80{background-color:#0a0c10cc}@supports (color:color-mix(in lab,red,red)){.bg-ink\/80{background-color:color-mix(in oklab,var(--color-ink) 80%,transparent)}}.bg-ink\/85{background-color:#0a0c10d9}@supports (color:color-mix(in lab,red,red)){.bg-ink\/85{background-color:color-mix(in oklab,var(--color-ink) 85%,transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-panel-2{background-color:var(--color-panel-2)}.bg-panel-2\/40{background-color:#0d101566}@supports (color:color-mix(in lab,red,red)){.bg-panel-2\/40{background-color:color-mix(in oklab,var(--color-panel-2) 40%,transparent)}}.bg-panel-2\/50{background-color:#0d101580}@supports (color:color-mix(in lab,red,red)){.bg-panel-2\/50{background-color:color-mix(in oklab,var(--color-panel-2) 50%,transparent)}}.bg-panel-2\/60{background-color:#0d101599}@supports (color:color-mix(in lab,red,red)){.bg-panel-2\/60{background-color:color-mix(in oklab,var(--color-panel-2) 60%,transparent)}}.bg-panel\/85{background-color:#13171ed9}@supports (color:color-mix(in lab,red,red)){.bg-panel\/85{background-color:color-mix(in oklab,var(--color-panel) 85%,transparent)}}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-400\/15{background-color:#ff667f26}@supports (color:color-mix(in lab,red,red)){.bg-rose-400\/15{background-color:color-mix(in oklab,var(--color-rose-400) 15%,transparent)}}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/10{background-color:color-mix(in oklab,var(--color-rose-500) 10%,transparent)}}.bg-sky-500\/15{background-color:#00a5ef26}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/15{background-color:color-mix(in oklab,var(--color-sky-500) 15%,transparent)}}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-violet-500\/15{background-color:#8d54ff26}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/15{background-color:color-mix(in oklab,var(--color-violet-500) 15%,transparent)}}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.fill-\[\#\.\.\]{fill:#..}.fill-\[\#161b22\]{fill:#161b22}.fill-emerald-300{fill:var(--color-emerald-300)}.fill-emerald-400{fill:var(--color-emerald-400)}.fill-emerald-400\/12{fill:#00d2941f}@supports (color:color-mix(in lab,red,red)){.fill-emerald-400\/12{fill:color-mix(in oklab,var(--color-emerald-400) 12%,transparent)}}.fill-emerald-400\/85{fill:#00d294d9}@supports (color:color-mix(in lab,red,red)){.fill-emerald-400\/85{fill:color-mix(in oklab,var(--color-emerald-400) 85%,transparent)}}.fill-emerald-500{fill:var(--color-emerald-500)}.fill-emerald-700{fill:var(--color-emerald-700)}.fill-emerald-900{fill:var(--color-emerald-900)}.fill-fg-faint{fill:var(--color-fg-faint)}.fill-fg-muted{fill:var(--color-fg-muted)}.fill-line{fill:var(--color-line)}.fill-panel{fill:var(--color-panel)}.stroke-emerald-400{stroke:var(--color-emerald-400)}.stroke-emerald-500\/20{stroke:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.stroke-emerald-500\/20{stroke:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.stroke-emerald-500\/25{stroke:#00bb7f40}@supports (color:color-mix(in lab,red,red)){.stroke-emerald-500\/25{stroke:color-mix(in oklab,var(--color-emerald-500) 25%,transparent)}}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#\.\.\]{color:#..}.text-\[\#…\]{color:#…}.text-\[Npx\]{color:Npx}.text-amber-200{color:var(--color-amber-200)}.text-amber-200\/70{color:#fee685b3}@supports (color:color-mix(in lab,red,red)){.text-amber-200\/70{color:color-mix(in oklab,var(--color-amber-200) 70%,transparent)}}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-400\/70{color:#00d294b3}@supports (color:color-mix(in lab,red,red)){.text-emerald-400\/70{color:color-mix(in oklab,var(--color-emerald-400) 70%,transparent)}}.text-fg{color:var(--color-fg)}.text-fg-faint{color:var(--color-fg-faint)}.text-fg-muted{color:var(--color-fg-muted)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-sky-300{color:var(--color-sky-300)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.accent-emerald-500{accent-color:var(--color-emerald-500)}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-fg-faint::placeholder{color:var(--color-fg-faint)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.hover\:border-emerald-500\/40:hover{border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/40:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.hover\:border-rose-500\/40:hover{border-color:#ff235766}@supports (color:color-mix(in lab,red,red)){.hover\:border-rose-500\/40:hover{border-color:color-mix(in oklab,var(--color-rose-500) 40%,transparent)}}.hover\:bg-white\/\[0\.06\]:hover{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.06\]:hover{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.hover\:bg-white\/\[0\.025\]:hover{background-color:#ffffff06}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.025\]:hover{background-color:color-mix(in oklab,var(--color-white) 2.5%,transparent)}}.hover\:text-emerald-400:hover{color:var(--color-emerald-400)}.hover\:text-fg:hover{color:var(--color-fg)}.hover\:text-fg-muted:hover{color:var(--color-fg-muted)}.hover\:text-rose-400:hover{color:var(--color-rose-400)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}}.focus\:border-emerald-500\/50:focus{border-color:#00bb7f80}@supports (color:color-mix(in lab,red,red)){.focus\:border-emerald-500\/50:focus{border-color:color-mix(in oklab,var(--color-emerald-500) 50%,transparent)}}.focus\:bg-white\/\[0\.06\]:focus{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.focus\:bg-white\/\[0\.06\]:focus{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.focus\:text-fg:focus{color:var(--color-fg)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:opacity-40:disabled{opacity:.4}@media(hover:hover){.disabled\:hover\:text-fg-muted:disabled:hover{color:var(--color-fg-muted)}}@media(min-width:40rem){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:64rem){.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:h-full{height:100%}.lg\:h-screen{height:100vh}.lg\:min-h-0{min-height:0}.lg\:w-auto{width:auto}.lg\:flex-none{flex:none}.lg\:grid-cols-\[minmax\(0\,1fr\)_380px\]{grid-template-columns:minmax(0,1fr) 380px}.lg\:flex-nowrap{flex-wrap:nowrap}.lg\:justify-between{justify-content:space-between}.lg\:overflow-hidden{overflow:hidden}.lg\:overflow-y-auto{overflow-y:auto}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.lg\:border-line{border-color:var(--color-line)}.lg\:px-5{padding-inline:calc(var(--spacing) * 5)}.lg\:py-1{padding-block:var(--spacing)}.lg\:pl-3{padding-left:calc(var(--spacing) * 3)}}}@keyframes rr-fade-up{0%{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}.rr-fade-up{animation:.45s cubic-bezier(.2,.7,.2,1) both rr-fade-up}@keyframes rr-spin{to{transform:rotate(360deg)}}.rr-sweep{transform-box:view-box;transform-origin:12px 12px;animation:3.4s linear infinite rr-spin}@media(prefers-reduced-motion:reduce){.rr-fade-up,.rr-sweep{animation:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}
package/dist/index.html CHANGED
@@ -16,8 +16,8 @@
16
16
  href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap"
17
17
  rel="stylesheet"
18
18
  />
19
- <script type="module" crossorigin src="/assets/index-BRwV22Gy.js"></script>
20
- <link rel="stylesheet" crossorigin href="/assets/index-DQkwmLip.css">
19
+ <script type="module" crossorigin src="/assets/index-BCKxFWzO.js"></script>
20
+ <link rel="stylesheet" crossorigin href="/assets/index-DP6ckDih.css">
21
21
  </head>
22
22
  <body>
23
23
  <div id="root"></div>
package/dist-cli/cli.js CHANGED
@@ -653,6 +653,10 @@ function buildCql(spaces = []) {
653
653
  const scope = spaces.length > 0 ? `space in (${spaces.join(",")}) AND ` : "";
654
654
  return `${scope}contributor = currentUser() AND type = page ORDER BY lastmodified DESC`;
655
655
  }
656
+ function buildFolderCql(folders) {
657
+ if (folders.length === 0) return "";
658
+ return `ancestor in (${folders.join(",")}) AND type = page ORDER BY lastmodified DESC`;
659
+ }
656
660
  const ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'", nbsp: " ", "#39": "'" };
657
661
  const decodeEntities = (t) => t.replace(/&([a-z]+|#\d+);/gi, (m, name) => ENTITIES[name.toLowerCase()] ?? m);
658
662
  function stripMarkup(source) {
@@ -690,7 +694,7 @@ function extractRepoRefs(text, knownRepos) {
690
694
  }
691
695
  return found;
692
696
  }
693
- function mapPage(raw, site, knownRepos) {
697
+ function mapPage(raw, site, knownRepos, origin = { mine: true, watched: false }) {
694
698
  const body = raw.body?.storage?.value;
695
699
  const text = `${raw.title} ${linkTargets(body)} ${stripMarkup(body)}`;
696
700
  const webui = raw._links?.webui ?? "";
@@ -702,9 +706,22 @@ function mapPage(raw, site, knownRepos) {
702
706
  url: webui ? `https://${site}/wiki${webui}` : `https://${site}/wiki/pages/viewpage.action?pageId=${raw.id}`,
703
707
  lastModified: raw.version?.when ?? "",
704
708
  lastModifiedBy: raw.version?.by?.accountId ?? "",
709
+ createdAt: raw.history?.createdDate ?? "",
710
+ mine: origin.mine,
711
+ watched: origin.watched,
705
712
  repos: extractRepoRefs(text, knownRepos)
706
713
  };
707
714
  }
715
+ function mergePages(groups) {
716
+ const byId = /* @__PURE__ */ new Map();
717
+ for (const group of groups) {
718
+ for (const page of group) {
719
+ const seen = byId.get(page.id);
720
+ byId.set(page.id, seen ? { ...seen, mine: seen.mine || page.mine, watched: seen.watched || page.watched } : page);
721
+ }
722
+ }
723
+ return [...byId.values()];
724
+ }
708
725
  const DAY = 24 * 60 * 60 * 1e3;
709
726
  function driftingPages(pages, repos, minDays = 1) {
710
727
  const pushedAt = new Map(repos.map((r) => [r.nameWithOwner, r.pushedAt]));
@@ -726,18 +743,19 @@ function driftingPages(pages, repos, minDays = 1) {
726
743
  lastModified: page.lastModified,
727
744
  repo,
728
745
  pushedAt: push,
729
- daysBehind
746
+ daysBehind,
747
+ mine: page.mine
730
748
  });
731
749
  }
732
750
  }
733
- return out.sort((a, b) => b.daysBehind - a.daysBehind || a.title.localeCompare(b.title));
751
+ return out.sort((a, b) => a.lastModified < b.lastModified ? 1 : a.lastModified > b.lastModified ? -1 : a.title.localeCompare(b.title));
734
752
  }
735
- const EXPAND = "space,version,body.storage";
753
+ const EXPAND = "space,version,history,body.storage";
736
754
  const PAGE_SIZE = 50;
737
- const MAX_TOTAL = 200;
755
+ const MAX_ROUNDS = 8;
738
756
  const accountIdCache = /* @__PURE__ */ new Map();
739
757
  async function fetchMyAccountId(cfg) {
740
- const key2 = `${cfg.site}\0${cfg.email}`;
758
+ const key2 = `${cfg.site}/${cfg.email}`;
741
759
  const cached = accountIdCache.get(key2);
742
760
  if (cached !== void 0) return cached;
743
761
  const token = getAtlassianToken(cfg.email);
@@ -753,25 +771,33 @@ async function fetchMyAccountId(cfg) {
753
771
  return null;
754
772
  }
755
773
  }
756
- async function fetchConfluencePages(cfg, knownRepos) {
757
- if (!cfg?.site || !cfg.email) return [];
758
- const token = getAtlassianToken(cfg.email);
759
- if (!token) return [];
760
- const headers = basicAuthHeaders(cfg.email, token);
761
- const cql = buildCql(cfg.spaces ?? []);
774
+ function nextPath(link) {
775
+ return link && link.startsWith("/rest/") ? link : null;
776
+ }
777
+ async function searchByCql(cfg, cql, headers, knownRepos, origin) {
778
+ const params = new URLSearchParams({ cql, expand: EXPAND, limit: String(PAGE_SIZE) });
779
+ let path = `/rest/api/content/search?${params}`;
762
780
  const out = [];
763
- for (let start = 0; start < MAX_TOTAL; start += PAGE_SIZE) {
764
- const params = new URLSearchParams({ cql, expand: EXPAND, limit: String(PAGE_SIZE), start: String(start) });
765
- const res = await fetch(`https://${cfg.site}/wiki/rest/api/content/search?${params}`, { headers });
781
+ for (let round = 0; round < MAX_ROUNDS && path; round++) {
782
+ const res = await fetch(`https://${cfg.site}/wiki${path}`, { headers });
766
783
  if (!res.ok)
767
784
  throw new Error(`Confluence /content/search HTTP ${res.status}: ${(await res.text()).slice(0, 200)}${authHint(res.status, cfg.email)}`);
768
785
  const json = await res.json();
769
- const batch = json.results ?? [];
770
- for (const raw of batch) if (raw?.id) out.push(mapPage(raw, cfg.site, knownRepos));
771
- if (batch.length < PAGE_SIZE) break;
786
+ for (const raw of json.results ?? []) if (raw?.id) out.push(mapPage(raw, cfg.site, knownRepos, origin));
787
+ path = nextPath(json._links?.next);
772
788
  }
773
789
  return out;
774
790
  }
791
+ async function fetchConfluencePages(cfg, knownRepos) {
792
+ if (!cfg?.site || !cfg.email) return [];
793
+ const token = getAtlassianToken(cfg.email);
794
+ if (!token) return [];
795
+ const headers = basicAuthHeaders(cfg.email, token);
796
+ const groups = [await searchByCql(cfg, buildCql(cfg.spaces ?? []), headers, knownRepos, { mine: true, watched: false })];
797
+ const folderCql = buildFolderCql(cfg.folders ?? []);
798
+ if (folderCql) groups.push(await searchByCql(cfg, folderCql, headers, knownRepos, { mine: false, watched: true }));
799
+ return mergePages(groups);
800
+ }
775
801
  function buildSlackQuery(repo) {
776
802
  return `"${repo}"`;
777
803
  }
@@ -894,24 +920,22 @@ async function fetchMyMentions(max = COUNT) {
894
920
  return [];
895
921
  }
896
922
  }
897
- function diffWikiPages(prev, next, now) {
923
+ function diffWikiPages(prev, next, now, opts = {}) {
898
924
  if (prev === null) return [];
899
925
  const before = new Map(prev.map((p) => [p.id, p]));
926
+ const since = opts.since ?? null;
900
927
  const out = [];
928
+ const base = (page) => ({ at: now, repo: page.space, number: 0, title: page.title, url: page.url, source: "wiki" });
901
929
  for (const page of next) {
902
930
  const b = before.get(page.id);
903
- if (!b || !page.lastModified || page.lastModified <= b.lastModified) continue;
931
+ if (!b) {
932
+ if (!since || !page.createdAt || page.createdAt <= since || page.byMe) continue;
933
+ out.push({ id: `wiki:${page.id}:added`, kind: "wiki_added", ...base(page) });
934
+ continue;
935
+ }
936
+ if (!page.lastModified || page.lastModified <= b.lastModified) continue;
904
937
  if (page.byMe) continue;
905
- out.push({
906
- id: `wiki:${page.id}:${page.lastModified}`,
907
- at: now,
908
- kind: "wiki_updated",
909
- repo: page.space,
910
- number: 0,
911
- title: page.title,
912
- url: page.url,
913
- source: "wiki"
914
- });
938
+ out.push({ id: `wiki:${page.id}:${page.lastModified}`, kind: "wiki_updated", ...base(page) });
915
939
  }
916
940
  return out;
917
941
  }
@@ -1058,6 +1082,7 @@ async function runSync(opts) {
1058
1082
  mkdirSync(opts.dataDir, { recursive: true });
1059
1083
  const prevIssues = readJson("issues.json");
1060
1084
  const prevRepos = readJson("repos.json");
1085
+ const prevSyncAt = readJson("meta.json")?.lastSyncAt ?? null;
1061
1086
  const lastComments = await fetchLastComments(token, commentIncreased(prevIssues, issues), MAX_COMMENT_LOOKUPS);
1062
1087
  const fresh = diffEvents(prevIssues, issues, login, to.toISOString(), {
1063
1088
  prevRepos: prevRepos ? new Set(prevRepos.map((r) => r.nameWithOwner)) : void 0,
@@ -1078,7 +1103,7 @@ async function runSync(opts) {
1078
1103
  writeFileSync(join(opts.dataDir, "refs.json"), JSON.stringify(refStates, null, 2));
1079
1104
  warnMissingAtlassianToken(opts, log);
1080
1105
  await writeJira(opts, log);
1081
- await writeConfluence(opts, repos, to.toISOString(), readJson, log);
1106
+ await writeConfluence(opts, repos, to.toISOString(), readJson, log, prevSyncAt);
1082
1107
  await writeSlack(opts, to.toISOString(), readJson, log);
1083
1108
  await writeSlackLinks(opts, issues, login, log);
1084
1109
  const totalCommits = activity.reduce((sum, a) => sum + a.commits, 0);
@@ -1113,7 +1138,7 @@ async function runLightSync(opts, log, readJson) {
1113
1138
  writeFileSync(join(opts.dataDir, "repos.json"), JSON.stringify(repos, null, 2));
1114
1139
  if (meta) writeFileSync(join(opts.dataDir, "meta.json"), JSON.stringify({ ...meta, lastSyncAt: to.toISOString() }, null, 2));
1115
1140
  await writeJira(opts, log);
1116
- await writeConfluence(opts, repos, to.toISOString(), readJson, log);
1141
+ await writeConfluence(opts, repos, to.toISOString(), readJson, log, meta?.lastSyncAt ?? null);
1117
1142
  await writeSlack(opts, to.toISOString(), readJson, log);
1118
1143
  log(`更新: open ${issues.length}件${fresh.length > 0 ? ` / 受信箱に${fresh.length}件` : ""}`);
1119
1144
  return { login, repos: repos.length, commits: 0, issues: issues.length, events: fresh.length };
@@ -1169,7 +1194,7 @@ function warnMissingAtlassianToken(opts, log) {
1169
1194
  log(` security add-generic-password -s github-reporadar-atlassian -a "${cfg.email}" -w "<APIトークン>"`);
1170
1195
  log(` トークンは https://id.atlassian.com/manage-profile/security/api-tokens で作れます`);
1171
1196
  }
1172
- async function writeConfluence(opts, repos, now, readJson, log) {
1197
+ async function writeConfluence(opts, repos, now, readJson, log, since) {
1173
1198
  if (!opts.confluence) return;
1174
1199
  try {
1175
1200
  const pages = await fetchConfluencePages(opts.confluence, repos.map((r) => r.nameWithOwner));
@@ -1187,15 +1212,18 @@ async function writeConfluence(opts, repos, now, readJson, log) {
1187
1212
  url: p.url,
1188
1213
  lastModified: p.lastModified,
1189
1214
  lastModifiedBy: p.lastModifiedBy,
1190
- byMe: myAccountId === null || p.lastModifiedBy === "" ? void 0 : p.lastModifiedBy === myAccountId
1215
+ byMe: myAccountId === null || p.lastModifiedBy === "" ? void 0 : p.lastModifiedBy === myAccountId,
1216
+ createdAt: p.createdAt,
1217
+ watched: p.watched
1191
1218
  }));
1192
1219
  const prevPages = readJson("confluence-pages.json");
1193
- const fresh = diffWikiPages(prevPages, refs, now);
1220
+ const fresh = diffWikiPages(prevPages, refs, now, { since });
1194
1221
  writeFileSync(join(opts.dataDir, "confluence-pages.json"), JSON.stringify(refs, null, 2));
1195
1222
  if (fresh.length > 0) {
1196
1223
  const events = mergeEvents(readJson("events.json") ?? [], fresh);
1197
1224
  writeFileSync(join(opts.dataDir, "events.json"), JSON.stringify(events, null, 2));
1198
- log(`Confluence: 更新${fresh.length}件を受信箱へ`);
1225
+ const added = fresh.filter((e) => e.kind === "wiki_added").length;
1226
+ log(`Confluence: ${added > 0 ? `追加${added}件 / ` : ""}更新${fresh.length - added}件を受信箱へ`);
1199
1227
  }
1200
1228
  } catch (err) {
1201
1229
  log(`Confluenceの取得に失敗: ${err instanceof Error ? err.message : String(err)}`);
@@ -1228,8 +1256,16 @@ const DEFAULTS = {
1228
1256
  atlassianSite: null,
1229
1257
  atlassianEmail: null,
1230
1258
  jiraProjects: [],
1231
- confluenceSpaces: []
1259
+ confluenceSpaces: [],
1260
+ confluenceFolders: []
1232
1261
  };
1262
+ function parseFolderId(raw) {
1263
+ const trimmed = raw.trim();
1264
+ if (/^\d+$/.test(trimmed)) return trimmed;
1265
+ const m = /\/folder\/(\d+)/.exec(trimmed);
1266
+ if (m) return m[1];
1267
+ throw new RangeError(`--confluence-folderはフォルダのID(数字)か、フォルダのURLで指定してください(受け取った値: ${raw})`);
1268
+ }
1233
1269
  function intIn(flag, raw, min, max) {
1234
1270
  if (raw === void 0 || raw.startsWith("--")) throw new RangeError(`${flag} には値が要ります`);
1235
1271
  const n = Number(raw);
@@ -1239,7 +1275,7 @@ function intIn(flag, raw, min, max) {
1239
1275
  return n;
1240
1276
  }
1241
1277
  function parseArgs(argv) {
1242
- const out = { ...DEFAULTS, orgs: [], jiraProjects: [], confluenceSpaces: [] };
1278
+ const out = { ...DEFAULTS, orgs: [], jiraProjects: [], confluenceSpaces: [], confluenceFolders: [] };
1243
1279
  let command = null;
1244
1280
  for (let i = 0; i < argv.length; i++) {
1245
1281
  const a = argv[i];
@@ -1290,6 +1326,13 @@ function parseArgs(argv) {
1290
1326
  if (!out.confluenceSpaces.includes(v)) out.confluenceSpaces.push(v);
1291
1327
  break;
1292
1328
  }
1329
+ case "--confluence-folder": {
1330
+ const v = argv[++i];
1331
+ if (v === void 0 || v.startsWith("--")) throw new RangeError(`${a}には値が要ります`);
1332
+ const id = parseFolderId(v);
1333
+ if (!out.confluenceFolders.includes(id)) out.confluenceFolders.push(id);
1334
+ break;
1335
+ }
1293
1336
  case "--jira-project": {
1294
1337
  const v = argv[++i];
1295
1338
  if (v === void 0 || v.startsWith("--")) throw new RangeError(`${a}には値が要ります`);
@@ -1351,6 +1394,7 @@ const USAGE = [
1351
1394
  row("--atlassian-site HOST", "Atlassianのサイト(example.atlassian.net)。--atlassian-emailとセット"),
1352
1395
  row("--atlassian-email ADDR", "Atlassianのメールアドレス。トークンはキーチェーンから取る"),
1353
1396
  row("--confluence-space KEY", "齟齬を見るスペースキー(繰り返し可)。省略すると自分が関わった全ページ"),
1397
+ row("--confluence-folder ID", "見張るフォルダ(繰り返し可)。IDでもフォルダのURLでも可。配下は他人が足した / 直したページも知らせる"),
1354
1398
  row("--jira-project KEY", "取得するプロジェクトキー(繰り返し可)。省略すると全部"),
1355
1399
  row("--org NAME", "組織のrepoも取得する(繰り返し可)。組織では自分がauthorのコミットと、自分が作ったか担当のissue/PRだけ数える"),
1356
1400
  row("--data-dir DIR", "データの置き場(既定: $XDG_CACHE_HOME か ~/.cache の github-reporadar/data)"),
@@ -1515,7 +1559,7 @@ async function main() {
1515
1559
  const site = args.atlassianSite;
1516
1560
  const email = args.atlassianEmail;
1517
1561
  const jira = site && email ? { site, email, projects: args.jiraProjects } : null;
1518
- const confluence = site && email ? { site, email, spaces: args.confluenceSpaces } : null;
1562
+ const confluence = site && email ? { site, email, spaces: args.confluenceSpaces, folders: args.confluenceFolders } : null;
1519
1563
  if (args.command === "sync") {
1520
1564
  await runSync({ dataDir, days: args.days, orgs: args.orgs, jira, confluence });
1521
1565
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-reporadar",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "自分のGitHub活動を一晩ぶん眺める計器盤。npx github-reporadarでローカルに開く",
5
5
  "license": "MIT",
6
6
  "bin": {