@pmelab/gtd 38.1.0 → 38.2.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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +30 -3
- package/dist/chunks/{Schema-DO5ttJaI.mjs → Schema-C6fLlQzx.mjs} +1 -1
- package/dist/chunks/{reserved-CfQ8eurM.mjs → reserved-C3PgP7XB.mjs} +1 -1
- package/dist/chunks/{tail-C7yaWvaS.mjs → tail-Bkxki2nK.mjs} +1 -1
- package/dist/gtd.bundle.mjs +291 -52
- package/dist/testkit.mjs +256 -20
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +2 -2
- package/dist/workflows/fix.mjs +2 -2
- package/dist/workflows/review.mjs +2 -2
- package/dist/workflows/rollout.mjs +1 -1
- package/package.json +1 -1
- package/src/cli/Cli.test.ts +15 -3
- package/src/cli/Cli.ts +61 -28
- package/src/cli/History.ts +1 -19
- package/src/cli/Metrics.test.ts +224 -0
- package/src/cli/Metrics.ts +310 -0
- package/src/cli/Output.ts +13 -0
- package/src/cli/Program.test.ts +3 -1
- package/src/cli/Program.ts +4 -0
package/README.md
CHANGED
|
@@ -723,9 +723,36 @@ full trail with `gtd history fetch | sh`, then `gtd history show <ref>`.
|
|
|
723
723
|
```sh
|
|
724
724
|
gtd history list # one line per kept process
|
|
725
725
|
gtd history show <ref> # replay its steps, judge verdicts and approvals
|
|
726
|
+
gtd history metrics [ref...] # how the kept processes went, per process and in total
|
|
726
727
|
gtd history fetch | sh # pull every kept ref from origin
|
|
727
728
|
```
|
|
728
729
|
|
|
730
|
+
`gtd history metrics` measures the bundled `feature` workflow from the kept refs
|
|
731
|
+
— every ref, or the ones named. It reads commit subjects and trailers only, so
|
|
732
|
+
it never replays and a config changed since is no refusal:
|
|
733
|
+
|
|
734
|
+
- **refactor-first rate** — of the slices whose naive pass was decided, the
|
|
735
|
+
share rebuilt rather than landed as it is; a landed pass that no longer
|
|
736
|
+
applies and is built afresh counts as rebuilt (`refactored` counts the
|
|
737
|
+
rebuilds a refactor came first for)
|
|
738
|
+
- **continuations** — agent turns that picked up a turn stopped at its context
|
|
739
|
+
limit, per phase (`seam.naive`, `implement.building`, `refactor.building`, …)
|
|
740
|
+
- **cost** — the `Gtd-Cost` a driver recorded with `gtd land --cost --model`, by
|
|
741
|
+
model and by phase (`naive`, `refactor`, `implement`, `other`), and the
|
|
742
|
+
**double work** of a rebuild: its naive pass plus the implement turns that
|
|
743
|
+
rebuilt it. By-model costs make two coder models comparable over the same kind
|
|
744
|
+
of work
|
|
745
|
+
- **findings** — the net count of `## ` findings each quality-lap lens added to
|
|
746
|
+
`.gtd/QUALITY.md`, keyed by the lap's lens path (`build.quality.correctness`,
|
|
747
|
+
`refactor.build.quality.correctness`, …)
|
|
748
|
+
|
|
749
|
+
`--json` prints `{ processes, total }`; `--json=total.refactorFirstRate` prints
|
|
750
|
+
one value. Model, phase and lens keys may hold dots a path cannot reach: select
|
|
751
|
+
their record whole (`--json=total.cost.byModel`). A branch name selects every
|
|
752
|
+
process kept from that branch. A rate is `null` without a decided slice. Each
|
|
753
|
+
process names its `workflow` (`null` for the default one); the total spans every
|
|
754
|
+
ref measured, so name the refs to leave another workflow's processes out.
|
|
755
|
+
|
|
729
756
|
`gtd history fetch` only prints a fetch script; pipe it into `sh` to run it.
|
|
730
757
|
Beyond that one ship push, refs are not pushed or fetched by default. The ref
|
|
731
758
|
holds every step commit, including steering files and code a later step removed,
|
|
@@ -781,9 +808,9 @@ install for any of these but `./testkit`: gtd resolves a `gtd.config.ts`'s
|
|
|
781
808
|
|
|
782
809
|
The `gtd` bin's commands — `next`, `land`, `abandon`, `restore`, `validate`,
|
|
783
810
|
`check`, `uncheck`, `install`, `summary`, `base`, `door`, `doors`, `slices`,
|
|
784
|
-
`version`, `help`, `history list`, `history show`, `history
|
|
785
|
-
and the tools `ui`, `lsp`, `loop`, `context-hook`,
|
|
786
|
-
`judge run`) — are listed in the
|
|
811
|
+
`version`, `help`, `history list`, `history show`, `history metrics`,
|
|
812
|
+
`history fetch`, `strays`, and the tools `ui`, `lsp`, `loop`, `context-hook`,
|
|
813
|
+
`judge` (`judge answer`, `judge run`) — are listed in the
|
|
787
814
|
[CLI reference](https://github.com/pmelab/gtd/blob/main/docs/cli.md).
|
|
788
815
|
`gtd slices` lists the spans a flow's `slice()` calls mark. It refuses (exit 1)
|
|
789
816
|
when HEAD neither closes nor sits inside a process, or when today's config
|
|
@@ -25449,4 +25449,4 @@ Struct({
|
|
|
25449
25449
|
description: "Represents an issue returned by the ArrayFormatter formatter"
|
|
25450
25450
|
});
|
|
25451
25451
|
//#endregion
|
|
25452
|
-
export { logWarning as $,
|
|
25452
|
+
export { logWarning as $, BaseProto as $i, map$4 as $n, make$20 as $r, provide$1 as $t, catchIf as A, add$2 as Ai, scopeMake as An, flatMap$3 as Ar, suspend$1 as At, flatMap$1 as B, getOrElse as Bi, get as Bn, sync$1 as Br, unsafeMakeLatch as Bt, all as C, toArray$1 as Ci, isInterrupted as Cn, exitFail as Cr, sandbox as Ct, async as D, GenericTag as Di, squash as Dn, exitZipRight as Dr, scopedWith as Dt, asVoid as E, unsafeHead as Ei, reduceWithContext as En, exitVoid$1 as Er, scoped as Et, ensuring as F, fromIterable$6 as Fi, join as Fn, map$5 as Fr, tryMap as Ft, forkIn as G, match$6 as Gi, TypeId$4 as Gn, whenEffect as Gr, zipLeft as Gt, fnUntraced as H, isNone as Hi, modify as Hn, uninterruptible$1 as Hr, when as Ht, exit as I, splitAt as Ii, sequential$1 as In, onInterrupt as Ir, tryPromise as It, ignore as J, isLeft as Ji, all$2 as Jn, DeferredTypeId as Jr, spaced as Jt, forkScoped as K, none$4 as Ki, Class as Kn, withFiberRuntime$1 as Kr, zipRight as Kt, fail$1 as L, filter$3 as Li, bind as Ln, scopeClose as Lr, try_ as Lt, die as M, getOption as Mi, _await as Mn, interruptAsFiber as Mr, tap as Mt, dieMessage as N, omit$1 as Ni, inheritAll as Nn, interruptFiber as Nr, tapErrorCause as Nt, catchAll as O, Reference as Oi, ensuring$1 as On, fiberId as Or, serviceOption as Ot, either as P, empty$22 as Pi, interruptAllAs as Pn, interruptible$2 as Pr, timeout as Pt, isEffect as Q, pipeArguments as Qi, isFailure as Qn, ids as Qr, mergeAll as Qt, failCause as R, flatMap$6 as Ri, bindTo as Rn, succeed$5 as Rr, uninterruptible as Rt, addFinalizer as S, takeRight as Si, isDieType as Sn, exitAs as Sr, runtime as St, as as T, unsafeGet as Ti, map$3 as Tn, exitSucceed$1 as Tr, scopeWith as Tt, forEach as U, isSome as Ui, set as Un, uninterruptibleMask$2 as Ur, withFiberRuntime as Ut, flatten as V, getOrUndefined as Vi, make$12 as Vn, tap$1 as Vr, unsafeMakeSemaphore as Vt, forkDaemon as W, map$11 as Wi, update$1 as Wn, void_$2 as Wr, zip as Wt, interruptible as X, match$7 as Xi, fail$4 as Xn, combine$5 as Xr, tagged as Xt, interrupt as Y, left as Yi, die$2 as Yn, empty$15 as Yr, TaggedError$1 as Yt, intoDeferred as Z, right as Zi, failCause$2 as Zn, combineAll as Zr, fromEffect as Zt, decodeSync as _, of$1 as _i, fail$2 as _n, deferredIsDone as _r, raceWith as _t, Literal as a, constFalse as aa, size$2 as ai, updateContext as an, zipRight$1 as ar, matchCause as at, acquireRelease as b, reverse$1 as bi, interrupt$1 as bn, deferredUnsafeDone as br, runPromise as bt, String$ as c, constVoid as ca, append as ci, Scope as cn, asyncInterrupt as cr, negate as ct, Union as d, pipe as da, empty$19 as di, close as dn, deferredAwait as dr, orElse$1 as dt, NodeInspectSymbol as ea, none$2 as ei, provideMerge as en, mapBoth$2 as er, makeSemaphore as et, between as f, filter$1 as fi, extend$1 as fn, deferredComplete as fr, orElseSucceed as ft, standardSchemaV1 as g, map$9 as gi, die$1 as gn, deferredInterruptWith as gr, race as gt, optionalWith as h, isEmpty$5 as hi, NoSuchElementException as hn, deferredInterrupt as hr, provideService as ht, Defect as i, hasProperty as ia, has$1 as ii, unsafeRunPromiseExit as in, zip$1 as ir, match as it, catchTag as j, get$7 as ji, scopeTag as jn, interrupt$2 as jr, sync as jt, catchAllCause as k, Tag as ki, forEachConcurrentDiscard as kn, fiberRefLocally as kr, succeed$1 as kt, Struct as l, dual as la, appendAll$1 as li, addFinalizer$1 as ln, catchAll$1 as lr, onError as lt, optional as m, isChunk as mi, make$2 as mn, deferredFailCause as mr, provide as mt, Boolean$ as n, toJSON as na, make$22 as ni, succeed$2 as nn, succeed$4 as nr, mapBoth$1 as nt, Never as o, constTrue as oa, decode as oi, forkIn$1 as on, as$1 as or, matchCauseEffect as ot, decodeUnknown as p, fromIterable$5 as pi, fork as pn, deferredFail as pr, promise as pt, gen as q, some as qi, spanTag as qn, zipRight$2 as qr, zipWith as qt, Cause as r, equals$2 as ra, set$3 as ri, unsafeFork as rn, void_$1 as rr, mapError$1 as rt, Number$ as s, constUndefined as sa, isFinite as si, unsafeMakeSemaphore$1 as sn, asVoid$1 as sr, matchEffect as st, Array$ as t, format$4 as ta, get$4 as ti, scoped$1 as tn, match$3 as tr, map$1 as tt, TaggedError as u, identity as ua, drop as ui, addFinalizerExit as un, currentContext as ur, orDie as ut, encodeSync as v, prepend$1 as vi, failureOrCause as vn, deferredMake as vr, repeat as vt, annotateLogs as w, unsafeFromArray as wi, isInterruptedOnly as wn, exitFailCause$1 as wr, scope as wt, acquireUseRelease as x, take as xi, interruptors as xn, deferredUnsafeMake as xr, runPromiseExit as xt, _void as y, reduce$6 as yi, flipCauseOption as yn, deferredSucceed as yr, retry as yt, fiberIdWith as z, fromNullable as zi, sleep as zn, suspend$3 as zr, uninterruptibleMask as zt };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { accessFor, agent, answered, changesSince, check, codeThreads, defineWorkflow, displayPath, env, head, human, judge, numeric, quote, read, refuse, scope, skillsFor, start, vars } from "../flows.mjs";
|
|
2
2
|
import { escalation as escalation$1, gate as gate$1, healthy as healthy$1, lensScopes, lensesOf, removedAssertions } from "../workflow-kit.mjs";
|
|
3
|
-
import { c as String$, g as standardSchemaV1, h as optionalWith, l as Struct, n as Boolean$, s as Number$ } from "./Schema-
|
|
3
|
+
import { c as String$, g as standardSchemaV1, h as optionalWith, l as Struct, n as Boolean$, s as Number$ } from "./Schema-C6fLlQzx.mjs";
|
|
4
4
|
//#region src/workflows/shared/registry.ts
|
|
5
5
|
const FILL = "";
|
|
6
6
|
const commentLength = (rest) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { read, refuse, removeScript, run, scope, showScript, vars } from "../flows.mjs";
|
|
2
2
|
import { fixFindings, lensEntriesOf, lensOf, qualityLap as qualityLap$1, reviewToHandOff } from "../workflow-kit.mjs";
|
|
3
|
-
import { C as fixCheck, D as reviewMissing, O as reviewQuality, T as fixRisks, Y as handOffAwaitReviewMessage, d as guarded, f as healthy, h as QUALITY, k as reviewing, l as escalation, w as fixQuality, x as awaitReview, y as REVIEW } from "./reserved-
|
|
3
|
+
import { C as fixCheck, D as reviewMissing, O as reviewQuality, T as fixRisks, Y as handOffAwaitReviewMessage, d as guarded, f as healthy, h as QUALITY, k as reviewing, l as escalation, w as fixQuality, x as awaitReview, y as REVIEW } from "./reserved-C3PgP7XB.mjs";
|
|
4
4
|
//#region src/workflows/shared/tail.ts
|
|
5
5
|
/** The reviewer's own `.gtd/REVIEW.md`, kept beside the human's notes so `fix` can tell them apart. */
|
|
6
6
|
const REVIEW_ORIG = ".gtd/REVIEW.orig.md";
|