@pmelab/gtd 24.2.0 → 24.3.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 +26 -2
- package/dist/chunks/{Schema-Dh-mkwkq.mjs → Schema-B5yK7QrT.mjs} +47 -1
- package/dist/chunks/{reserved-ejn-LVYO.mjs → reserved-DJwU5C4z.mjs} +1 -1
- package/dist/gtd.bundle.mjs +337 -55
- package/dist/testkit.mjs +477 -65
- package/dist/workflows/feature.mjs +1 -1
- package/dist/workflows/fix.mjs +1 -1
- package/dist/workflows/review.mjs +1 -1
- package/package.json +1 -1
- package/src/cli/Cli.test.ts +57 -0
- package/src/cli/Cli.ts +89 -9
- package/src/cli/History.test.ts +225 -0
- package/src/cli/History.ts +143 -0
- package/src/cli/Output.ts +68 -0
- package/src/cli/Program.test.ts +7 -1
- package/src/cli/Program.ts +23 -64
- package/src/edge/Edge.test.ts +256 -1
- package/src/edge/Edge.ts +217 -39
- package/src/edge/index.ts +1 -0
- package/src/emit/GitScript.test.ts +27 -0
- package/src/emit/GitScript.ts +18 -2
- package/src/emit/index.ts +1 -0
- package/src/platform/Git.ts +48 -10
- package/src/platform/RetainedHistory.test.ts +14 -0
- package/src/platform/RetainedHistory.ts +5 -0
- package/src/platform/index.ts +7 -1
- package/src/replay/Trailers.test.ts +32 -0
- package/src/replay/Trailers.ts +17 -0
- package/src/step/LandStep.ts +3 -1
- package/src/step/RepoSnapshot.ts +7 -1
- package/src/step/planStart.test.ts +6 -3
- package/src/step/planStep.test.ts +29 -1
- package/src/step/planStep.ts +8 -0
- package/src/testkit/EmittedScriptRecognizer.ts +1 -1
- package/src/testkit/FakeGitOperations.ts +6 -2
- package/src/testkit/GitTiers.ts +133 -2
- package/src/testkit/InMemRepo.ts +26 -6
package/README.md
CHANGED
|
@@ -544,6 +544,30 @@ unknown key. `gtd.config.ts` is the only repository config: gtd 23 removed the
|
|
|
544
544
|
home directory — fails every command until you delete it. See
|
|
545
545
|
[Migrating from `.gtdrc`](https://github.com/pmelab/gtd/blob/main/docs/configuration.md#migrating-from-gtdrc).
|
|
546
546
|
|
|
547
|
+
## Process history
|
|
548
|
+
|
|
549
|
+
When a process finishes, the landing that closes it also keeps the whole run
|
|
550
|
+
behind a ref, `refs/gtd/history/<entry>`, so a squash or a deleted branch
|
|
551
|
+
doesn't lose it. `/gtd ship` changes nothing about this: the turns are already
|
|
552
|
+
kept before it squashes.
|
|
553
|
+
|
|
554
|
+
```sh
|
|
555
|
+
gtd history list # one line per kept process
|
|
556
|
+
gtd history show <ref> # replay its steps and judge verdicts
|
|
557
|
+
gtd history fetch | sh # pull every kept ref from origin
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
`gtd history fetch` only prints a fetch script; pipe it into `sh` to run it.
|
|
561
|
+
Refs are not pushed or fetched by default. To share them:
|
|
562
|
+
|
|
563
|
+
```sh
|
|
564
|
+
git push origin 'refs/gtd/history/*'
|
|
565
|
+
git config --add remote.origin.fetch 'refs/gtd/history/*:refs/gtd/history/*'
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
The second line makes every plain `git fetch` include them. It has no leading
|
|
569
|
+
`+`, so a conflicting local ref fails instead of being overwritten.
|
|
570
|
+
|
|
547
571
|
## Entrypoints
|
|
548
572
|
|
|
549
573
|
gtd is one package, `@pmelab/gtd`, and every entrypoint shares its version and
|
|
@@ -565,8 +589,8 @@ install for any of these but `./testkit`: gtd resolves a `gtd.config.ts`'s
|
|
|
565
589
|
|
|
566
590
|
The `gtd` bin's commands — `next`, `land`, `abandon`, `restore`, `validate`,
|
|
567
591
|
`check`, `uncheck`, `install`, `summary`, `base`, `door`, `doors`, `version`,
|
|
568
|
-
`help`,
|
|
569
|
-
`judge run`) — are listed in the
|
|
592
|
+
`help`, `history list`, `history show`, `history fetch`, and the tools `ui`,
|
|
593
|
+
`lsp`, `loop` and `judge` (`judge answer`, `judge run`) — are listed in the
|
|
570
594
|
[CLI reference](https://github.com/pmelab/gtd/blob/main/docs/cli.md).
|
|
571
595
|
|
|
572
596
|
## License
|
|
@@ -12242,6 +12242,7 @@ const mapErrorCause = /*#__PURE__*/ dual(2, (self, f) => matchCauseEffect$2(self
|
|
|
12242
12242
|
onSuccess: succeed$5
|
|
12243
12243
|
}));
|
|
12244
12244
|
const negate$1 = (self) => map$5(self, (b) => !b);
|
|
12245
|
+
const orElseSucceed$1 = /*#__PURE__*/ dual(2, (self, evaluate) => orElse$2(self, () => sync$1(evaluate)));
|
|
12245
12246
|
const patchFiberRefs = (patch) => updateFiberRefs((fiberId, fiberRefs) => pipe(patch, patch$2(fiberId, fiberRefs)));
|
|
12246
12247
|
const promise$1 = (evaluate) => evaluate.length >= 1 ? async_((resolve, signal) => {
|
|
12247
12248
|
try {
|
|
@@ -21189,6 +21190,51 @@ const orDie = orDie$1;
|
|
|
21189
21190
|
*/
|
|
21190
21191
|
const orElse$1 = orElse$2;
|
|
21191
21192
|
/**
|
|
21193
|
+
* Ensures the effect always succeeds by replacing failures with a default
|
|
21194
|
+
* success value.
|
|
21195
|
+
*
|
|
21196
|
+
* **Details**
|
|
21197
|
+
*
|
|
21198
|
+
* This function transforms an effect that may fail into one that cannot fail by
|
|
21199
|
+
* replacing any failure with a provided success value. If the original effect
|
|
21200
|
+
* fails, the failure is "swallowed," and the specified success value is
|
|
21201
|
+
* returned instead. If the original effect succeeds, its value remains
|
|
21202
|
+
* unchanged.
|
|
21203
|
+
*
|
|
21204
|
+
* **When to Use**
|
|
21205
|
+
*
|
|
21206
|
+
* This is especially useful for providing default values in case of failure,
|
|
21207
|
+
* ensuring that an effect always completes successfully. By using this
|
|
21208
|
+
* function, you can avoid the need for complex error handling and guarantee a
|
|
21209
|
+
* fallback result.
|
|
21210
|
+
*
|
|
21211
|
+
* **Example**
|
|
21212
|
+
*
|
|
21213
|
+
* ```ts
|
|
21214
|
+
* import { Effect } from "effect"
|
|
21215
|
+
*
|
|
21216
|
+
* const validate = (age: number): Effect.Effect<number, string> => {
|
|
21217
|
+
* if (age < 0) {
|
|
21218
|
+
* return Effect.fail("NegativeAgeError")
|
|
21219
|
+
* } else if (age < 18) {
|
|
21220
|
+
* return Effect.fail("IllegalAgeError")
|
|
21221
|
+
* } else {
|
|
21222
|
+
* return Effect.succeed(age)
|
|
21223
|
+
* }
|
|
21224
|
+
* }
|
|
21225
|
+
*
|
|
21226
|
+
* const program = Effect.orElseSucceed(validate(-1), () => 18)
|
|
21227
|
+
*
|
|
21228
|
+
* console.log(Effect.runSyncExit(program))
|
|
21229
|
+
* // Output:
|
|
21230
|
+
* // { _id: 'Exit', _tag: 'Success', value: 18 }
|
|
21231
|
+
* ```
|
|
21232
|
+
*
|
|
21233
|
+
* @since 2.0.0
|
|
21234
|
+
* @category Fallback
|
|
21235
|
+
*/
|
|
21236
|
+
const orElseSucceed = orElseSucceed$1;
|
|
21237
|
+
/**
|
|
21192
21238
|
* Returns an effect that accesses the runtime, which can be used to (unsafely)
|
|
21193
21239
|
* execute tasks.
|
|
21194
21240
|
*
|
|
@@ -25350,4 +25396,4 @@ Struct({
|
|
|
25350
25396
|
description: "Represents an issue returned by the ArrayFormatter formatter"
|
|
25351
25397
|
});
|
|
25352
25398
|
//#endregion
|
|
25353
|
-
export { makeSemaphore as $,
|
|
25399
|
+
export { makeSemaphore as $, toJSON as $i, mapBoth$2 as $n, none$2 as $r, provideMerge as $t, catchTag as A, getOption as Ai, scopeTag as An, interrupt$2 as Ar, sync as At, flatten as B, isSome as Bi, make$12 as Bn, tap$1 as Br, unsafeMakeSemaphore as Bt, all as C, unsafeFromArray as Ci, isInterruptedOnly as Cn, exitFailCause$1 as Cr, scope as Ct, async as D, Tag as Di, ensuring$1 as Dn, fiberId as Dr, serviceOption as Dt, asVoid as E, GenericTag as Ei, squash as En, exitZipRight as Er, scopedWith as Et, exit as F, filter$3 as Fi, sequential$1 as Fn, onInterrupt as Fr, tryPromise as Ft, forkScoped as G, isLeft as Gi, Class as Gn, withFiberRuntime$1 as Gr, zipRight as Gt, forEach as H, match$6 as Hi, set as Hn, uninterruptibleMask$2 as Hr, withFiberRuntime as Ht, fail$1 as I, flatMap$6 as Ii, bind as In, scopeClose as Ir, try_ as It, interrupt as J, right as Ji, die$2 as Jn, empty$15 as Jr, TaggedError$1 as Jt, gen as K, left as Ki, spanTag as Kn, zipRight$2 as Kr, zipWith as Kt, failCause as L, fromNullable as Li, bindTo as Ln, succeed$5 as Lr, uninterruptible as Lt, dieMessage as M, empty$22 as Mi, inheritAll as Mn, interruptFiber as Mr, tapErrorCause as Mt, either as N, fromIterable$6 as Ni, interruptAllAs as Nn, interruptible$2 as Nr, timeout as Nt, catchAll as O, add$2 as Oi, forEachConcurrentDiscard as On, fiberRefLocally as Or, succeed$1 as Ot, ensuring as P, splitAt as Pi, join as Pn, map$5 as Pr, tryMap as Pt, logWarning as Q, format$4 as Qi, map$4 as Qn, make$20 as Qr, provide$1 as Qt, fiberIdWith as R, getOrElse as Ri, sleep as Rn, suspend$3 as Rr, uninterruptibleMask as Rt, addFinalizer as S, toArray$1 as Si, isInterrupted as Sn, exitFail as Sr, sandbox as St, as as T, unsafeHead as Ti, reduceWithContext as Tn, exitVoid$1 as Tr, scoped as Tt, forkDaemon as U, none$4 as Ui, update$1 as Un, void_$2 as Ur, zip as Ut, fnUntraced as V, map$11 as Vi, modify as Vn, uninterruptible$1 as Vr, when as Vt, forkIn as W, some as Wi, TypeId$4 as Wn, whenEffect as Wr, zipLeft as Wt, intoDeferred as X, BaseProto as Xi, failCause$2 as Xn, combineAll as Xr, fromEffect as Xt, interruptible as Y, pipeArguments as Yi, fail$4 as Yn, combine$5 as Yr, tagged as Yt, isEffect as Z, NodeInspectSymbol as Zi, isFailure as Zn, ids as Zr, mergeAll as Zt, decodeSync as _, prepend$1 as _i, failureOrCause as _n, deferredMake as _r, repeat as _t, Literal as a, constVoid as aa, decode as ai, forkIn$1 as an, as$1 as ar, matchCauseEffect as at, acquireRelease as b, take as bi, interruptors as bn, deferredUnsafeMake as br, runPromiseExit as bt, String$ as c, pipe as ca, appendAll$1 as ci, addFinalizer$1 as cn, catchAll$1 as cr, onError as ct, Union as d, filter$1 as di, extend$1 as dn, deferredComplete as dr, orElseSucceed as dt, equals$2 as ea, get$4 as ei, scoped$1 as en, match$3 as er, map$1 as et, between as f, fromIterable$5 as fi, fork as fn, deferredFail as fr, promise as ft, standardSchemaV1 as g, of$1 as gi, fail$2 as gn, deferredIsDone as gr, raceWith as gt, optionalWith as h, map$9 as hi, die$1 as hn, deferredInterruptWith as hr, race as ht, Defect as i, constUndefined as ia, size$2 as ii, updateContext as in, zipRight$1 as ir, matchCause as it, die as j, omit$1 as ji, _await as jn, interruptAsFiber as jr, tap as jt, catchAllCause as k, get$7 as ki, scopeMake as kn, flatMap$3 as kr, suspend$1 as kt, Struct as l, drop as li, addFinalizerExit as ln, currentContext as lr, orDie as lt, optional as m, isEmpty$5 as mi, NoSuchElementException as mn, deferredInterrupt as mr, provideService as mt, Boolean$ as n, constFalse as na, set$3 as ni, unsafeFork as nn, void_$1 as nr, mapError$1 as nt, Never as o, dual as oa, isFinite as oi, unsafeMakeSemaphore$1 as on, asVoid$1 as or, matchEffect as ot, decodeUnknown as p, isChunk as pi, make$2 as pn, deferredFailCause as pr, provide as pt, ignore as q, match$7 as qi, all$2 as qn, DeferredTypeId as qr, spaced as qt, Cause as r, constTrue as ra, has$1 as ri, unsafeRunPromiseExit as rn, zip$1 as rr, match as rt, Number$ as s, identity as sa, append as si, Scope as sn, asyncInterrupt as sr, negate as st, Array$ as t, hasProperty as ta, make$22 as ti, succeed$2 as tn, succeed$4 as tr, mapBoth$1 as tt, TaggedError as u, empty$19 as ui, close as un, deferredAwait as ur, orElse$1 as ut, encodeSync as v, reduce$6 as vi, flipCauseOption as vn, deferredSucceed as vr, retry as vt, annotateLogs as w, unsafeGet as wi, map$3 as wn, exitSucceed$1 as wr, scopeWith as wt, acquireUseRelease as x, takeRight as xi, isDieType as xn, exitAs as xr, runtime as xt, _void as y, reverse$1 as yi, interrupt$1 as yn, deferredUnsafeDone as yr, runPromise as yt, flatMap$1 as z, isNone as zi, get as zn, sync$1 as zr, unsafeMakeLatch as zt };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { accessFor, agent, answered, check, codeThreads, defineWorkflow, env, head, human, judge, numeric, quote, read, refuse, removeScript, run, scope, skillsFor, start, vars } from "../flows.mjs";
|
|
2
2
|
import { escalation as escalation$1, fixFindings, gate as gate$1, healthy as healthy$1, holdWording as holdWording$1, lensScopes, lensesOf, qualityLap as qualityLap$1, reviewToHandOff, untilSettled } from "../workflow-kit.mjs";
|
|
3
|
-
import { c as String$, g as standardSchemaV1, h as optionalWith, l as Struct } from "./Schema-
|
|
3
|
+
import { c as String$, g as standardSchemaV1, h as optionalWith, l as Struct } from "./Schema-B5yK7QrT.mjs";
|
|
4
4
|
import { dirname } from "node:path";
|
|
5
5
|
//#region src/workflows/shared/prose.ts
|
|
6
6
|
const skillsPreamble = `- Load whatever's listed here that your harness actually has installed,
|