@pmelab/gtd 64.0.0 → 64.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +8 -8
- package/dist/chunks/{steering-DkA51qDa.mjs → steering-Cem5i6Xl.mjs} +421 -1
- package/dist/chunks/{testkit-zGjNeQNL.mjs → testkit-DfWZQCWQ.mjs} +63 -16
- package/dist/gtd.bundle.mjs +485 -19
- package/dist/gtd.core.mjs +117 -110
- package/dist/steering.mjs +2 -2
- package/dist/testkit/gherkin.mjs +1 -1
- package/dist/testkit.mjs +1 -1
- package/dist/web/main.css +1 -1
- package/dist/workflow-kit.mjs +1 -1
- package/package.json +1 -1
- package/src/cli/Cli.ts +13 -1
- package/src/cli/Program.ts +23 -4
- package/src/edge/Edge.ts +23 -9
- package/src/emit/SteeringMode.ts +21 -1
- package/src/flows/index.ts +1 -0
- package/src/flows/runtime.test.ts +2 -1
- package/src/flows/runtime.ts +8 -2
- package/src/steering/Declared.test.ts +218 -0
- package/src/steering/Declared.ts +607 -0
- package/src/steering/FORMATS.md +3 -0
- package/src/steering/index.ts +12 -0
- package/src/steering/internal.ts +1 -0
- package/src/twins/EmittedScriptRecognizer.ts +5 -3
- package/src/twins/EmittedScripts.test.ts +19 -0
- package/src/workflow/SteeringFormats.ts +4 -0
- package/src/workflow/Workflow.ts +2 -0
- package/src/workflow/index.ts +5 -1
package/dist/steering.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
export { ANSWER_FIX, ANSWER_LEAD, ANSWER_WONT_FIX, FIX_BOX, FREE_TEXT_PLACEHOLDER, NOISE_HEADING, REVIEW_SECTIONS, applySteeringEdits, findingEntries, formatFinding, freeFormFormat, isAnswered, openQuestions, openThreadFindings, openThreads, parseCodeThreads, parseFootnotes, parseThreads, parseThreadsWithFindings, reviewChunks, reviewDecisions, reviewNotes, reviewRisks, reviewSections, sectionBodies, sections, steeringFormatFor, stripCodeThreads, threads, unansweredNotes };
|
|
1
|
+
import { A as findingEntries, C as reviewRisks, D as isAnswered, E as FREE_TEXT_PLACEHOLDER, I as formatFinding, M as parseFootnotes, N as parseThreads, O as FIX_BOX, P as parseThreadsWithFindings, S as reviewNotes, T as unansweredNotes, _ as ANSWER_LEAD, a as sections, b as reviewChunks, c as openThreads, f as listFormat, g as ANSWER_FIX, h as applySteeringEdits, i as sectionBodies, j as openThreadFindings, k as NOISE_HEADING, l as steeringFormatFor, m as freeFormFormat, n as stripCodeThreads, o as threads, p as sectionFormat, r as openQuestions, t as parseCodeThreads, v as ANSWER_WONT_FIX, w as reviewSections, x as reviewDecisions, y as REVIEW_SECTIONS } from "./chunks/steering-Cem5i6Xl.mjs";
|
|
2
|
+
export { ANSWER_FIX, ANSWER_LEAD, ANSWER_WONT_FIX, FIX_BOX, FREE_TEXT_PLACEHOLDER, NOISE_HEADING, REVIEW_SECTIONS, applySteeringEdits, findingEntries, formatFinding, freeFormFormat, isAnswered, listFormat, openQuestions, openThreadFindings, openThreads, parseCodeThreads, parseFootnotes, parseThreads, parseThreadsWithFindings, reviewChunks, reviewDecisions, reviewNotes, reviewRisks, reviewSections, sectionBodies, sectionFormat, sections, steeringFormatFor, stripCodeThreads, threads, unansweredNotes };
|
package/dist/testkit/gherkin.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as runsItsScript, r as testRepo } from "../chunks/testkit-
|
|
1
|
+
import { n as runsItsScript, r as testRepo } from "../chunks/testkit-DfWZQCWQ.mjs";
|
|
2
2
|
import { pathToFileURL } from "node:url";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { After, AfterAll, Given, QuickPickleWorld, Then, When, setWorldConstructor } from "quickpickle";
|
package/dist/testkit.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { H as installContext } from "./chunks/flows-B7ZRCe-B.mjs";
|
|
2
|
-
import { a as verdictWhen, i as verdict, n as runsItsScript, o as whenPrompted, r as testRepo, t as inTurn } from "./chunks/testkit-
|
|
2
|
+
import { a as verdictWhen, i as verdict, n as runsItsScript, o as whenPrompted, r as testRepo, t as inTurn } from "./chunks/testkit-DfWZQCWQ.mjs";
|
|
3
3
|
export { inTurn, installContext, runsItsScript, testRepo, verdict, verdictWhen, whenPrompted };
|
package/dist/web/main.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@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-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-outline-style:solid;--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;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--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-page:#111;--color-surface:#222;--color-divider:#3a3a3a;--color-border:#6e6e6e;--color-text:#eee;--color-muted:#b4b4b4;--color-accent:#0090ff;--color-accent-pressed:#3b9eff;--color-link:#70b8ff;--color-disabled:#606060;--color-warning:#ffca16;--color-danger:#ff9592;--color-diff-add:#113b29;--color-diff-del:#500f1c;--color-heading-a:#baa7ff;--color-heading-b:#4ccce6;--color-heading-c:#1fd8a4;--color-code:#ffa057;--color-quote:#6e56cf;--color-syntax-kw:#baa7ff;--color-syntax-str:#ffca16;--color-syntax-num:#4ccce6;--color-syntax-typ:#1fd8a4;--color-syntax-com:#b4b4b4;--text-body:16px;--text-body--line-height:1.5;--text-large:20px;--text-large--line-height:1.3;--text-small:13px;--text-small--line-height:1.3}}@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%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;-webkit-text-decoration: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:where(:not(iframe)){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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.top-0{top:0}.top-1{top:var(--spacing)}.right-1{right:var(--spacing)}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.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}}.m-0{margin:0}.m-3{margin:calc(var(--spacing) * 3)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.list-item{display:list-item}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.h-1{height:var(--spacing)}.h-\[600px\]{height:600px}.h-\[2000px\]{height:2000px}.h-\[3000px\]{height:3000px}.h-auto{height:auto}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-32{min-height:calc(var(--spacing) * 32)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.max-w-\[390px\]{max-width:390px}.max-w-\[430px\]{max-width:430px}.max-w-\[calc\(100\%-1\.5rem\)\]{max-width:calc(100% - 1.5rem)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-max{min-width:max-content}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[deck-item-in_140ms_ease-out\]{animation:.14s ease-out deck-item-in}.animate-\[scrim-in_160ms_ease-out\]{animation:.16s ease-out scrim-in}.animate-\[scrim-out_160ms_ease-out_forwards\]{animation:.16s ease-out forwards scrim-out}.animate-\[sheet-in_220ms_cubic-bezier\(0\.2\,0\,0\,1\)\]{animation:.22s cubic-bezier(.2,0,0,1) sheet-in}.animate-\[sheet-out_160ms_ease-out_forwards\]{animation:.16s ease-out forwards sheet-out}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.touch-manipulation{touch-action:manipulation}.resize-none{resize:none}.resize-y{resize:vertical}.list-outside{list-style-position:outside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.self-center{align-self:center}.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-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-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-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-accent{border-color:var(--color-accent)}.border-border{border-color:var(--color-border)}.border-danger{border-color:var(--color-danger)}.border-divider{border-color:var(--color-divider)}.border-quote{border-color:var(--color-quote)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-accent{border-left-color:var(--color-accent)}.bg-accent{background-color:var(--color-accent)}.bg-danger{background-color:var(--color-danger)}.bg-diff-add{background-color:var(--color-diff-add)}.bg-diff-del{background-color:var(--color-diff-del)}.bg-divider{background-color:var(--color-divider)}.bg-muted{background-color:var(--color-muted)}.bg-page{background-color:var(--color-page)}.bg-page\/60{background-color:#1119}@supports (color:color-mix(in lab, red, red)){.bg-page\/60{background-color:color-mix(in oklab, var(--color-page) 60%, transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--color-warning)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-0{padding-inline:0}.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)}.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)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-0{padding-bottom:0}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-7{padding-left:calc(var(--spacing) * 7)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-13{padding-left:calc(var(--spacing) * 13)}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-body{font-size:var(--text-body);line-height:var(--tw-leading,var(--text-body--line-height))}.text-large{font-size:var(--text-large);line-height:var(--tw-leading,var(--text-large--line-height))}.text-small{font-size:var(--text-small);line-height:var(--tw-leading,var(--text-small--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-pre{white-space:pre}.text-black{color:var(--color-black)}.text-code{color:var(--color-code)}.text-danger{color:var(--color-danger)}.text-heading-a{color:var(--color-heading-a)}.text-heading-b{color:var(--color-heading-b)}.text-heading-c{color:var(--color-heading-c)}.text-inherit{color:inherit}.text-link{color:var(--color-link)}.text-muted{color:var(--color-muted)}.text-page{color:var(--color-page)}.text-syntax-com{color:var(--color-syntax-com)}.text-syntax-kw{color:var(--color-syntax-kw)}.text-syntax-num{color:var(--color-syntax-num)}.text-syntax-str{color:var(--color-syntax-str)}.text-syntax-typ{color:var(--color-syntax-typ)}.text-text{color:var(--color-text)}.text-warning{color:var(--color-warning)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.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{text-decoration-line:underline}.shadow{--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-\[0_-8px_32px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow:0 -8px 32px var(--tw-shadow-color,#00000080);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-offset-2{outline-offset:2px}.outline-muted{outline-color:var(--color-muted)}.blur{--tw-blur:blur(8px);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,)}.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-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,border-color\]{transition-property:background-color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[scale\]{transition-property:scale;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.marker\:text-link ::marker{color:var(--color-link)}.marker\:text-link::marker{color:var(--color-link)}.marker\:text-link ::-webkit-details-marker{color:var(--color-link)}.marker\:text-link::-webkit-details-marker{color:var(--color-link)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:calc(2px * -1)}.focus-visible\:outline-accent:focus-visible{outline-color:var(--color-accent)}.active\:scale-96:active{--tw-scale-x:96%;--tw-scale-y:96%;--tw-scale-z:96%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-\[0\.99\]:active{scale:.99}.active\:bg-accent-pressed:active{background-color:var(--color-accent-pressed)}.active\:bg-border:active{background-color:var(--color-border)}.active\:bg-surface:active{background-color:var(--color-surface)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:bg-disabled:disabled{background-color:var(--color-disabled)}.disabled\:bg-surface:disabled{background-color:var(--color-surface)}.disabled\:text-disabled:disabled{color:var(--color-disabled)}.disabled\:text-muted:disabled{color:var(--color-muted)}.disabled\:opacity-60:disabled{opacity:.6}}.diff-dimmed{opacity:.85}body{background:var(--color-page);color:var(--color-text);margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}input[type=checkbox],input[type=radio]{accent-color:var(--color-accent);flex-shrink:0;width:1.25rem;height:1.25rem;margin:0}textarea{border:1px solid var(--color-border);background:var(--color-surface);width:100%;color:var(--color-text);font:inherit;border-radius:.25rem;padding:.5rem;font-size:16px}textarea:focus-visible{outline:2px solid var(--color-accent);outline-offset:-1px}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}@keyframes scrim-in{0%{opacity:0}}@keyframes sheet-in{0%{transform:translateY(100%)}}@keyframes sheet-out{to{transform:translateY(100%)}}@keyframes scrim-out{to{opacity:0}}@keyframes deck-item-in{0%{opacity:.2}}@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-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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}
|
|
2
|
+
@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-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-outline-style:solid;--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;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-sm:8px;--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-page:#111;--color-surface:#222;--color-divider:#3a3a3a;--color-border:#6e6e6e;--color-text:#eee;--color-muted:#b4b4b4;--color-accent:#0090ff;--color-accent-pressed:#3b9eff;--color-link:#70b8ff;--color-disabled:#606060;--color-warning:#ffca16;--color-danger:#ff9592;--color-diff-add:#113b29;--color-diff-del:#500f1c;--color-heading-a:#baa7ff;--color-heading-b:#4ccce6;--color-heading-c:#1fd8a4;--color-code:#ffa057;--color-quote:#6e56cf;--color-syntax-kw:#baa7ff;--color-syntax-str:#ffca16;--color-syntax-num:#4ccce6;--color-syntax-typ:#1fd8a4;--color-syntax-com:#b4b4b4;--text-body:16px;--text-body--line-height:1.5;--text-large:20px;--text-large--line-height:1.3;--text-small:13px;--text-small--line-height:1.3}}@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%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;-webkit-text-decoration: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:where(:not(iframe)){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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.top-0{top:0}.top-1{top:var(--spacing)}.right-1{right:var(--spacing)}.right-3{right:calc(var(--spacing) * 3)}.bottom-3{bottom:calc(var(--spacing) * 3)}.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}}.m-0{margin:0}.m-3{margin:calc(var(--spacing) * 3)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.list-item{display:list-item}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.h-1{height:var(--spacing)}.h-\[600px\]{height:600px}.h-\[2000px\]{height:2000px}.h-\[3000px\]{height:3000px}.h-auto{height:auto}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-32{min-height:calc(var(--spacing) * 32)}.w-9{width:calc(var(--spacing) * 9)}.w-full{width:100%}.max-w-\[390px\]{max-width:390px}.max-w-\[430px\]{max-width:430px}.max-w-\[calc\(100\%-1\.5rem\)\]{max-width:calc(100% - 1.5rem)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-max{min-width:max-content}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[deck-item-in_140ms_ease-out\]{animation:.14s ease-out deck-item-in}.animate-\[scrim-in_160ms_ease-out\]{animation:.16s ease-out scrim-in}.animate-\[scrim-out_160ms_ease-out_forwards\]{animation:.16s ease-out forwards scrim-out}.animate-\[sheet-in_220ms_cubic-bezier\(0\.2\,0\,0\,1\)\]{animation:.22s cubic-bezier(.2,0,0,1) sheet-in}.animate-\[sheet-out_160ms_ease-out_forwards\]{animation:.16s ease-out forwards sheet-out}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.touch-manipulation{touch-action:manipulation}.resize-none{resize:none}.resize-y{resize:vertical}.list-outside{list-style-position:outside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.self-center{align-self:center}.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-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-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-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-accent{border-color:var(--color-accent)}.border-border{border-color:var(--color-border)}.border-danger{border-color:var(--color-danger)}.border-divider{border-color:var(--color-divider)}.border-quote{border-color:var(--color-quote)}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-accent{border-left-color:var(--color-accent)}.bg-accent{background-color:var(--color-accent)}.bg-danger{background-color:var(--color-danger)}.bg-diff-add{background-color:var(--color-diff-add)}.bg-diff-del{background-color:var(--color-diff-del)}.bg-divider{background-color:var(--color-divider)}.bg-muted{background-color:var(--color-muted)}.bg-page{background-color:var(--color-page)}.bg-page\/60{background-color:#1119}@supports (color:color-mix(in lab, red, red)){.bg-page\/60{background-color:color-mix(in oklab, var(--color-page) 60%, transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--color-warning)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-0{padding-inline:0}.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)}.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)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-0{padding-bottom:0}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-7{padding-left:calc(var(--spacing) * 7)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-13{padding-left:calc(var(--spacing) * 13)}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-body{font-size:var(--text-body);line-height:var(--tw-leading,var(--text-body--line-height))}.text-large{font-size:var(--text-large);line-height:var(--tw-leading,var(--text-large--line-height))}.text-small{font-size:var(--text-small);line-height:var(--tw-leading,var(--text-small--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-pre{white-space:pre}.text-black{color:var(--color-black)}.text-code{color:var(--color-code)}.text-danger{color:var(--color-danger)}.text-heading-a{color:var(--color-heading-a)}.text-heading-b{color:var(--color-heading-b)}.text-heading-c{color:var(--color-heading-c)}.text-inherit{color:inherit}.text-link{color:var(--color-link)}.text-muted{color:var(--color-muted)}.text-page{color:var(--color-page)}.text-syntax-com{color:var(--color-syntax-com)}.text-syntax-kw{color:var(--color-syntax-kw)}.text-syntax-num{color:var(--color-syntax-num)}.text-syntax-str{color:var(--color-syntax-str)}.text-syntax-typ{color:var(--color-syntax-typ)}.text-text{color:var(--color-text)}.text-warning{color:var(--color-warning)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.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{text-decoration-line:underline}.shadow{--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-\[0_-8px_32px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow:0 -8px 32px var(--tw-shadow-color,#00000080);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-offset-2{outline-offset:2px}.outline-muted{outline-color:var(--color-muted)}.blur{--tw-blur:blur(8px);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,)}.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-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[background-color\,border-color\]{transition-property:background-color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[scale\]{transition-property:scale;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.marker\:text-link ::marker{color:var(--color-link)}.marker\:text-link::marker{color:var(--color-link)}.marker\:text-link ::-webkit-details-marker{color:var(--color-link)}.marker\:text-link::-webkit-details-marker{color:var(--color-link)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:calc(2px * -1)}.focus-visible\:outline-accent:focus-visible{outline-color:var(--color-accent)}.active\:scale-96:active{--tw-scale-x:96%;--tw-scale-y:96%;--tw-scale-z:96%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:scale-\[0\.99\]:active{scale:.99}.active\:bg-accent-pressed:active{background-color:var(--color-accent-pressed)}.active\:bg-border:active{background-color:var(--color-border)}.active\:bg-surface:active{background-color:var(--color-surface)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:bg-disabled:disabled{background-color:var(--color-disabled)}.disabled\:bg-surface:disabled{background-color:var(--color-surface)}.disabled\:text-disabled:disabled{color:var(--color-disabled)}.disabled\:text-muted:disabled{color:var(--color-muted)}.disabled\:opacity-60:disabled{opacity:.6}}.diff-dimmed{opacity:.85}body{background:var(--color-page);color:var(--color-text);overflow-wrap:anywhere;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}input[type=checkbox],input[type=radio]{accent-color:var(--color-accent);flex-shrink:0;width:1.25rem;height:1.25rem;margin:0}textarea{border:1px solid var(--color-border);background:var(--color-surface);width:100%;color:var(--color-text);font:inherit;border-radius:.25rem;padding:.5rem;font-size:16px}textarea:focus-visible{outline:2px solid var(--color-accent);outline-offset:-1px}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}@keyframes scrim-in{0%{opacity:0}}@keyframes sheet-in{0%{transform:translateY(100%)}}@keyframes sheet-out{to{transform:translateY(100%)}}@keyframes scrim-out{to{opacity:0}}@keyframes deck-item-in{0%{opacity:.2}}@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-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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}
|
package/dist/workflow-kit.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as head, F as changesSince, G as mark, P as changes, X as read, Z as refuse, d as hasThreadFor, et as scope, g as requireReplies, v as requireThreadsClosed } from "./chunks/flows-B7ZRCe-B.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { C as reviewRisks, N as parseThreads, S as reviewNotes, T as unansweredNotes, n as stripCodeThreads, x as reviewDecisions } from "./chunks/steering-Cem5i6Xl.mjs";
|
|
3
3
|
//#region src/workflow-kit/health.ts
|
|
4
4
|
/** Hand a red suite that repeated attempts could not fix to a person, until `limit` rounds are spent. */
|
|
5
5
|
const escalation = async (count, steps) => {
|
package/package.json
CHANGED
package/src/cli/Cli.ts
CHANGED
|
@@ -325,6 +325,16 @@ const FLAGS: readonly FlagRow[] = [
|
|
|
325
325
|
valueHint: "",
|
|
326
326
|
help: "Instead of <mode>'s findings, list the open threads in <file>; exits 1 when any are open. Alone, lists the open code-comment threads in the files the current process changed",
|
|
327
327
|
},
|
|
328
|
+
{
|
|
329
|
+
name: "--spec",
|
|
330
|
+
arity: 1,
|
|
331
|
+
repeatable: false,
|
|
332
|
+
scope: (kind) => kind === "check",
|
|
333
|
+
decode: ([raw]) => Result.succeed(raw ?? ""),
|
|
334
|
+
scopeError: "gtd: --spec is only valid for `gtd check`",
|
|
335
|
+
valueHint: "<json>",
|
|
336
|
+
help: "Check against the declared format this spec describes, named <mode>, instead of a built-in one; validation scripts pass it for a step whose mode is a declared format",
|
|
337
|
+
},
|
|
328
338
|
{
|
|
329
339
|
name: "--verbose",
|
|
330
340
|
arity: 0,
|
|
@@ -587,7 +597,7 @@ The fixed answerer reads --answers and leaves out the questions it does not cove
|
|
|
587
597
|
arity: { names: ["mode", "file"] },
|
|
588
598
|
group: "Driver plumbing",
|
|
589
599
|
summary: "Check a steering file's format",
|
|
590
|
-
details: `Run the steering format <mode> (qa, review or findings) over <file> and print each finding on a line of its own; exits 1 when there are any, or when <file> does not exist. An unknown <mode> is a usage error (exit 2). Reads no workflow and runs from any directory — emitted validation scripts call it.`,
|
|
600
|
+
details: `Run the steering format <mode> (qa, review or findings, or the declared format --spec describes) over <file> and print each finding on a line of its own; exits 1 when there are any, or when <file> does not exist. An unknown <mode> is a usage error (exit 2). Reads no workflow and runs from any directory — emitted validation scripts call it.`,
|
|
591
601
|
},
|
|
592
602
|
{
|
|
593
603
|
token: "uncheck",
|
|
@@ -1124,6 +1134,7 @@ export const parseArgv = (argv: readonly string[]): CliPlan => {
|
|
|
1124
1134
|
readonly "--threshold"?: Readonly<Record<string, string>>
|
|
1125
1135
|
readonly "--open-questions"?: boolean
|
|
1126
1136
|
readonly "--open-threads"?: boolean
|
|
1137
|
+
readonly "--spec"?: string
|
|
1127
1138
|
readonly "--host"?: string
|
|
1128
1139
|
readonly "--self-signed"?: boolean
|
|
1129
1140
|
readonly "--dev"?: boolean
|
|
@@ -1199,6 +1210,7 @@ export const parseArgv = (argv: readonly string[]): CliPlan => {
|
|
|
1199
1210
|
? { openQuestions: bag["--open-questions"] }
|
|
1200
1211
|
: {}),
|
|
1201
1212
|
...(bag["--open-threads"] !== undefined ? { openThreads: bag["--open-threads"] } : {}),
|
|
1213
|
+
...(bag["--spec"] !== undefined ? { spec: bag["--spec"] } : {}),
|
|
1202
1214
|
},
|
|
1203
1215
|
json,
|
|
1204
1216
|
verbose,
|
package/src/cli/Program.ts
CHANGED
|
@@ -70,6 +70,7 @@ import { formatCommitMessage, PIN_STATES } from "../replay/index.js"
|
|
|
70
70
|
import { planStart, planStep as planStepPure, type JudgeVerdict } from "../step/index.js"
|
|
71
71
|
import {
|
|
72
72
|
BUILT_IN_MODE_NAMES,
|
|
73
|
+
formatFromSpec,
|
|
73
74
|
steeringFormatFor,
|
|
74
75
|
openThreads,
|
|
75
76
|
parseCodeThreads,
|
|
@@ -169,6 +170,8 @@ export type Command =
|
|
|
169
170
|
readonly file?: string
|
|
170
171
|
readonly openQuestions?: boolean
|
|
171
172
|
readonly openThreads?: boolean
|
|
173
|
+
/** A declared format's spec: `mode` names it, and no built-in is looked up. */
|
|
174
|
+
readonly spec?: string
|
|
172
175
|
}
|
|
173
176
|
| { readonly kind: "uncheck"; readonly file: string }
|
|
174
177
|
| { readonly kind: "guide" }
|
|
@@ -903,8 +906,9 @@ const selfValidateCommand = (
|
|
|
903
906
|
state: string,
|
|
904
907
|
mode: StateMode,
|
|
905
908
|
file: string,
|
|
909
|
+
spec: string | undefined,
|
|
906
910
|
): string => {
|
|
907
|
-
const resolved = resolveMode(def, state, mode)
|
|
911
|
+
const resolved = resolveMode(def, state, mode, spec)
|
|
908
912
|
const validate = resolved.kind === "resolved" ? resolved.validate : undefined
|
|
909
913
|
const command = validate?.kind === "command" ? validate.command : seededValidateCommand(mode)
|
|
910
914
|
return commandForFile(command, file)
|
|
@@ -934,7 +938,7 @@ const resolveValidateScript = (
|
|
|
934
938
|
const mode = rest.stepDef.mode
|
|
935
939
|
if (file === undefined || mode === undefined) return undefined
|
|
936
940
|
|
|
937
|
-
const resolved = resolveMode(rest.def, rest.state, mode)
|
|
941
|
+
const resolved = resolveMode(rest.def, rest.state, mode, rest.stepDef.modeSpec)
|
|
938
942
|
if (resolved.kind === "unknown") {
|
|
939
943
|
return yield* Effect.fail(new Error(resolved.message))
|
|
940
944
|
}
|
|
@@ -976,7 +980,13 @@ const runNextCommand = (
|
|
|
976
980
|
yield* writeSelection(out, fields, json.path)
|
|
977
981
|
} else {
|
|
978
982
|
const validateCommand = emitsValidatablePrompt(rendered)
|
|
979
|
-
? selfValidateCommand(
|
|
983
|
+
? selfValidateCommand(
|
|
984
|
+
rest.def,
|
|
985
|
+
rest.state,
|
|
986
|
+
rendered.mode!,
|
|
987
|
+
rendered.file!,
|
|
988
|
+
rest.stepDef.modeSpec,
|
|
989
|
+
)
|
|
980
990
|
: undefined
|
|
981
991
|
if (DEMAND_BRIEFING[fields.kind].suppressHeader) {
|
|
982
992
|
// A prompt's stdout is the agent's input, so its header goes to stderr;
|
|
@@ -1019,9 +1029,10 @@ const runCheckCommand = (
|
|
|
1019
1029
|
file: string,
|
|
1020
1030
|
openQuestions: boolean,
|
|
1021
1031
|
openThreadsFlag: boolean,
|
|
1032
|
+
spec: string | undefined,
|
|
1022
1033
|
): Effect.Effect<void, Error, Workspace> =>
|
|
1023
1034
|
Effect.gen(function* () {
|
|
1024
|
-
const format = steeringFormatFor(mode)
|
|
1035
|
+
const format = spec !== undefined ? yield* declaredFormat(spec) : steeringFormatFor(mode)
|
|
1025
1036
|
if (format === undefined) {
|
|
1026
1037
|
return yield* Effect.fail(
|
|
1027
1038
|
new GtdUsageError(
|
|
@@ -1071,6 +1082,13 @@ const runCheckCommand = (
|
|
|
1071
1082
|
)
|
|
1072
1083
|
})
|
|
1073
1084
|
|
|
1085
|
+
const declaredFormat = (spec: string): Effect.Effect<SteeringFormat, GtdUsageError> =>
|
|
1086
|
+
Effect.try({
|
|
1087
|
+
try: () => formatFromSpec(spec),
|
|
1088
|
+
catch: (error) =>
|
|
1089
|
+
new GtdUsageError(`gtd check: --spec is not a declared format: ${(error as Error).message}`),
|
|
1090
|
+
})
|
|
1091
|
+
|
|
1074
1092
|
const existingFile = (file: string): Effect.Effect<string, Error, Workspace> =>
|
|
1075
1093
|
Effect.flatMap(Workspace, (workspace) => {
|
|
1076
1094
|
const content = workspace.atPath(file)
|
|
@@ -1384,6 +1402,7 @@ const dispatchVoidCommand = (
|
|
|
1384
1402
|
command.file,
|
|
1385
1403
|
command.openQuestions ?? false,
|
|
1386
1404
|
command.openThreads ?? false,
|
|
1405
|
+
command.spec,
|
|
1387
1406
|
)
|
|
1388
1407
|
case "uncheck":
|
|
1389
1408
|
return runUncheckCommand(command.file)
|
package/src/edge/Edge.ts
CHANGED
|
@@ -705,7 +705,7 @@ const DEFAULT_JUDGE_MESSAGE =
|
|
|
705
705
|
const optional = <K extends string, V>(key: K, value: V | undefined): { [P in K]?: V } =>
|
|
706
706
|
(value === undefined ? {} : { [key]: value }) as { [P in K]?: V }
|
|
707
707
|
|
|
708
|
-
type StepCommon = Pick<StepDef, "actor" | "label" | "file" | "mode">
|
|
708
|
+
type StepCommon = Pick<StepDef, "actor" | "label" | "file" | "mode" | "modeSpec">
|
|
709
709
|
|
|
710
710
|
const commonOf = (step: ReachedStep): StepCommon => {
|
|
711
711
|
const options = step.request.options
|
|
@@ -713,7 +713,9 @@ const commonOf = (step: ReachedStep): StepCommon => {
|
|
|
713
713
|
actor: step.actor,
|
|
714
714
|
...optional("label", options.label),
|
|
715
715
|
...optional("file", options.file),
|
|
716
|
-
...
|
|
716
|
+
...(typeof options.mode === "object"
|
|
717
|
+
? { mode: options.mode.name, modeSpec: options.mode.spec }
|
|
718
|
+
: optional("mode", options.mode)),
|
|
717
719
|
}
|
|
718
720
|
}
|
|
719
721
|
|
|
@@ -833,6 +835,23 @@ const hintsOf = (def: StepDef): RestHints => ({
|
|
|
833
835
|
...optional("access", def.access),
|
|
834
836
|
})
|
|
835
837
|
|
|
838
|
+
/** A step's mode is a name the workflow knows, or a declared format named apart from all of them. */
|
|
839
|
+
const modeFaultOf = (
|
|
840
|
+
def: WorkflowDefinition,
|
|
841
|
+
stepName: string,
|
|
842
|
+
stepDef: StepDef,
|
|
843
|
+
): string | undefined => {
|
|
844
|
+
if (stepDef.mode === undefined) return undefined
|
|
845
|
+
const known = def.modes[stepDef.mode] !== undefined
|
|
846
|
+
if (stepDef.modeSpec !== undefined)
|
|
847
|
+
return known
|
|
848
|
+
? `gtd: config: step "${stepName}": declared format "${stepDef.mode}" has the name of a mode this workflow already knows — rename the format`
|
|
849
|
+
: undefined
|
|
850
|
+
return known
|
|
851
|
+
? undefined
|
|
852
|
+
: `gtd: config: step "${stepName}": mode "${stepDef.mode}" is not a mode this workflow knows (${knownModes(def).join(", ")})`
|
|
853
|
+
}
|
|
854
|
+
|
|
836
855
|
const normalizeStatus = (raw: string): ChangeStatus => (raw === "A" ? "A" : raw === "D" ? "D" : "M")
|
|
837
856
|
|
|
838
857
|
/** The currently rested step and its description — enough for the viewer and the LSP. */
|
|
@@ -997,13 +1016,8 @@ export const restAt = (
|
|
|
997
1016
|
const { reached, step } = resting
|
|
998
1017
|
const { stepDef, state, memory } = restFacts(pin, step, reached.trace, run)
|
|
999
1018
|
yield* (yield* Narrator).narrate(`rest resolved: ${state} (awaits ${stepDef.actor})`)
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
new Error(
|
|
1003
|
-
`gtd: config: step "${step.name}": mode "${stepDef.mode}" is not a mode this workflow knows (${knownModes(def).join(", ")})`,
|
|
1004
|
-
),
|
|
1005
|
-
)
|
|
1006
|
-
}
|
|
1019
|
+
const modeFault = modeFaultOf(def, step.name, stepDef)
|
|
1020
|
+
if (modeFault !== undefined) return yield* Effect.fail(new Error(modeFault))
|
|
1007
1021
|
const changes =
|
|
1008
1022
|
ref === undefined
|
|
1009
1023
|
? (yield* pendingChanges(git, stepDef.approve === true)).map((e) => ({
|
package/src/emit/SteeringMode.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { Effect, Path } from "effect"
|
|
2
2
|
import { Host, type HostOps } from "../platform/index.js"
|
|
3
3
|
import {
|
|
4
|
+
declaredValidateCommand,
|
|
4
5
|
isSeededValidateCommand,
|
|
5
6
|
knownModes,
|
|
6
7
|
type StateMode,
|
|
7
8
|
type WorkflowDefinition,
|
|
8
9
|
} from "../workflow/index.js"
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
formatFromSpec,
|
|
12
|
+
steeringFormatFor,
|
|
13
|
+
type SteeringFinding,
|
|
14
|
+
type SteeringFormat,
|
|
15
|
+
} from "../steering/internal.js"
|
|
10
16
|
import { buildModeContradictionCheck, modeContradictionSkipNotice } from "./ModeContradiction.js"
|
|
11
17
|
import {
|
|
12
18
|
binaryGuard,
|
|
@@ -101,12 +107,26 @@ const capabilitiesFor = (
|
|
|
101
107
|
* The `"unknown"` arm carries the whole refusal message, naming what IS known
|
|
102
108
|
* when `def` is given — this is the one place that message is built, so it
|
|
103
109
|
* can never drift from what actually resolved.
|
|
110
|
+
*
|
|
111
|
+
* `spec` is a declared format's: it alone decides, validating through
|
|
112
|
+
* `gtd check --spec` with no `format:` half.
|
|
104
113
|
*/
|
|
105
114
|
export const resolveMode = (
|
|
106
115
|
def: Pick<WorkflowDefinition, "modes"> | undefined,
|
|
107
116
|
state: string,
|
|
108
117
|
mode: StateMode,
|
|
118
|
+
spec?: string,
|
|
109
119
|
): ModeResolution => {
|
|
120
|
+
if (spec !== undefined) {
|
|
121
|
+
const format = formatFromSpec(spec)
|
|
122
|
+
return {
|
|
123
|
+
kind: "resolved",
|
|
124
|
+
mode,
|
|
125
|
+
format,
|
|
126
|
+
validate: { kind: "command", command: declaredValidateCommand(mode, spec) },
|
|
127
|
+
capabilities: { format, liveValidate: format.validate },
|
|
128
|
+
}
|
|
129
|
+
}
|
|
110
130
|
const declared = def?.modes?.[mode]
|
|
111
131
|
const format = steeringFormatFor(mode)
|
|
112
132
|
if (declared === undefined && format === undefined) {
|
package/src/flows/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
type AgentOptions,
|
|
20
20
|
type HumanOptions,
|
|
21
21
|
type Judgment,
|
|
22
|
+
type DeclaredMode,
|
|
22
23
|
type ModeName,
|
|
23
24
|
type RunOptions,
|
|
24
25
|
type Settings,
|
|
@@ -315,6 +316,6 @@ describe("mode", () => {
|
|
|
315
316
|
expectTypeOf<"qa">().toMatchTypeOf<ModeName>()
|
|
316
317
|
expectTypeOf<string>().toMatchTypeOf<ModeName>()
|
|
317
318
|
expectTypeOf<ModeName>().toMatchTypeOf<string>()
|
|
318
|
-
expectTypeOf<SteeringOptions["mode"]>().toEqualTypeOf<ModeName | undefined>()
|
|
319
|
+
expectTypeOf<SteeringOptions["mode"]>().toEqualTypeOf<ModeName | DeclaredMode | undefined>()
|
|
319
320
|
})
|
|
320
321
|
})
|
package/src/flows/runtime.ts
CHANGED
|
@@ -8,6 +8,12 @@ import type { WorkflowBuild } from "./factory.js"
|
|
|
8
8
|
/** A steering-file mode: a built-in format's name or a `config.modes` entry. */
|
|
9
9
|
export type ModeName = "qa" | "review" | "findings" | (string & {})
|
|
10
10
|
|
|
11
|
+
/** A format declared with `listFormat`/`sectionFormat` from `@pmelab/gtd/steering`, used as a step's mode. */
|
|
12
|
+
export interface DeclaredMode {
|
|
13
|
+
readonly name: string
|
|
14
|
+
readonly spec: string
|
|
15
|
+
}
|
|
16
|
+
|
|
11
17
|
interface SteeringCommon {
|
|
12
18
|
/** Display name for drivers and viewers. */
|
|
13
19
|
readonly label?: string | undefined
|
|
@@ -24,8 +30,8 @@ type SteeringFile =
|
|
|
24
30
|
}
|
|
25
31
|
| {
|
|
26
32
|
readonly file: string
|
|
27
|
-
/** The steering file's mode — a built-in name
|
|
28
|
-
readonly mode: ModeName
|
|
33
|
+
/** The steering file's mode — a built-in name, a `modes:` entry, or a declared format. Requires `file`. */
|
|
34
|
+
readonly mode: ModeName | DeclaredMode
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
/** A steering-file declaration shared by the steps that rest on one. `mode` requires `file`. */
|