halfcycle 0.4.9 → 0.4.11
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/bin/bin.bundle.mjs +152 -137
- package/dist/bin.js +0 -0
- package/dist/build-record/render-v2.d.ts +5 -0
- package/dist/build-record/render-v2.d.ts.map +1 -1
- package/dist/cli-contract.d.ts.map +1 -1
- package/dist/cli.js +290 -122
- package/dist/cli.js.map +3 -3
- package/dist/close-phase.d.ts +10 -2
- package/dist/close-phase.d.ts.map +1 -1
- package/dist/draw/index.d.ts +4 -1
- package/dist/draw/index.d.ts.map +1 -1
- package/dist/index.js +137 -62
- package/dist/index.js.map +2 -2
- package/dist/plan.d.ts +21 -10
- package/dist/plan.d.ts.map +1 -1
- package/dist/review.d.ts +6 -3
- package/dist/review.d.ts.map +1 -1
- package/package.json +11 -11
package/dist/close-phase.d.ts
CHANGED
|
@@ -231,6 +231,13 @@ export declare function reviewOpenedLine(phase: string): string;
|
|
|
231
231
|
export declare const COULD_NOT_COUNT_LINE = "[halfcycle] Halfcycle could not count what this phase changed, so the owner judges each part on what the agents reported alone.";
|
|
232
232
|
/** H1 (`typed-close-review`) — how the owner reviews, or that typing is switched off. */
|
|
233
233
|
export declare function typedReviewHintLine(offered: boolean): string;
|
|
234
|
+
/**
|
|
235
|
+
* After H1 (`system-view-page` AC7): the console's way to review, ending with the
|
|
236
|
+
* phase's System view address on `engagementId`. The second way while typing is
|
|
237
|
+
* offered, the way while it is switched off. `undefined` when there is no address (an
|
|
238
|
+
* id that is not an engagement id), and then no line is printed.
|
|
239
|
+
*/
|
|
240
|
+
export declare function systemViewReviewLine(offered: boolean, engagementId: string, phase: string): string | undefined;
|
|
234
241
|
/** CL3 — tasks of the phase are not finished, named by title, at most ten. */
|
|
235
242
|
export declare function tasksOpenLine(phase: string, open: readonly string[], more: number): string;
|
|
236
243
|
/** CL4 — no build of the phase has been reported. */
|
|
@@ -253,12 +260,13 @@ export interface CloseStepReport {
|
|
|
253
260
|
}
|
|
254
261
|
/**
|
|
255
262
|
* Every line the close step prints for one attempt. An open prints CL1, then CL2 when
|
|
256
|
-
* the answer says Halfcycle could not count, then H1,
|
|
263
|
+
* the answer says Halfcycle could not count, then H1, then the System view line on
|
|
264
|
+
* `engagementId` (`systemViewReviewLine`), and closes nothing; a commit
|
|
257
265
|
* that could not be read is then said on stderr, with the reasons this verb has always
|
|
258
266
|
* given (git missing and git's bad answer stay two), because the statements carry the
|
|
259
267
|
* commit to the record. A refusal from the service names each field by its flag, as a
|
|
260
268
|
* refusal on this machine does (`describeIssuePath`). A refusal prints
|
|
261
269
|
* its own sentence and exits 1.
|
|
262
270
|
*/
|
|
263
|
-
export declare function closeStepReport(phase: string, attempt: ReviewOpenAttempt): CloseStepReport;
|
|
271
|
+
export declare function closeStepReport(phase: string, attempt: ReviewOpenAttempt, engagementId: string): CloseStepReport;
|
|
264
272
|
//# sourceMappingURL=close-phase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close-phase.d.ts","sourceRoot":"","sources":["../src/close-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"close-phase.d.ts","sourceRoot":"","sources":["../src/close-phase.ts"],"names":[],"mappings":"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"}
|
package/dist/draw/index.d.ts
CHANGED
|
@@ -143,7 +143,10 @@ export type PasteTarget = {
|
|
|
143
143
|
};
|
|
144
144
|
/** The architecture's paste target. */
|
|
145
145
|
export declare const ARCHITECTURE_PASTE: PasteTarget;
|
|
146
|
-
/** A phase's paste target: `Phase <name
|
|
146
|
+
/** A phase's paste target: `Phase "<name>"`, in `docs/phases/`. Quoted
|
|
147
|
+
* (agreed difference #41, FW-03's form), same reason `closedPhraseFor`
|
|
148
|
+
* above is: an unquoted name is indistinguishable from Halfcycle's own
|
|
149
|
+
* plan-order number on a project that names a phase a plain digit. */
|
|
147
150
|
export declare function phasePaste(phase: string): PasteTarget;
|
|
148
151
|
/** The Markdown to paste into the document `target` names, and the line before it. */
|
|
149
152
|
export declare function pasteLines(mermaid: string, target: PasteTarget): string;
|
package/dist/draw/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/draw/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AAEH,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAA2E,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpH,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAcL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,KAAK,EACL,YAAY,EACZ,eAAe,EACf,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAEpB,kFAAkF;AAClF,eAAO,MAAM,UAAU,6EAA6E,CAAC;AAErG,oEAAoE;AACpE,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAExG,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAsB/D;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAO3B,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAEhE;AAUD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DjH;AAED;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAChG,QAAQ,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,KAAK,kBAAkB,CAAC;CAClG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/draw/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -790,10 +790,10 @@ var buildRecordV2Schema = z5.object({
|
|
|
790
790
|
|
|
791
791
|
// ../events/dist/crew.js
|
|
792
792
|
import { z as z6 } from "zod";
|
|
793
|
-
var crewGroupSchema = z6.enum(["builder", "reviewer", "
|
|
793
|
+
var crewGroupSchema = z6.enum(["analyst-architect", "builder", "reviewer", "lead"]);
|
|
794
794
|
var crewTierSchema = z6.enum(["deep", "standard", "fast"]);
|
|
795
795
|
var CREW_DISCIPLINE_MAX = 64;
|
|
796
|
-
var crewFaceHeadSchema = z6.enum(["sq", "sqr", "rnd", "dome", "hex"]);
|
|
796
|
+
var crewFaceHeadSchema = z6.enum(["sq", "sqr", "rnd", "dome", "hex", "gable"]);
|
|
797
797
|
var crewFaceAntennaSchema = z6.enum(["none", "stalk", "twin", "dish"]);
|
|
798
798
|
var crewFaceEyesSchema = z6.enum(["dots", "bars", "visor", "cyclops"]);
|
|
799
799
|
var crewFaceMouthSchema = z6.enum(["line", "grid", "dots", "wave"]);
|
|
@@ -810,12 +810,25 @@ var crewFaceSchema = z6.object({
|
|
|
810
810
|
// Whether this member is drawn with ears.
|
|
811
811
|
ears: z6.boolean()
|
|
812
812
|
}).strict();
|
|
813
|
+
var crewRoleSchema = z6.enum([
|
|
814
|
+
"business-analyst",
|
|
815
|
+
"architect",
|
|
816
|
+
"spec-writer",
|
|
817
|
+
"builder",
|
|
818
|
+
"context-docs",
|
|
819
|
+
"spec-reviewer",
|
|
820
|
+
"code-test-reviewer",
|
|
821
|
+
"delivery-lead",
|
|
822
|
+
"quality-lead"
|
|
823
|
+
]);
|
|
813
824
|
var crewMemberSchema = z6.object({
|
|
814
|
-
// The agent's name. The same
|
|
825
|
+
// The agent's name. The same names on every project, so a name is a
|
|
815
826
|
// vocabulary a returning client already knows.
|
|
816
827
|
callsign: z6.string().min(1).max(32),
|
|
817
|
-
// Which of the
|
|
828
|
+
// Which of the four teams this member belongs to.
|
|
818
829
|
group: crewGroupSchema,
|
|
830
|
+
// The part this member plays, which decides the stages it leads and helps with.
|
|
831
|
+
role: crewRoleSchema,
|
|
819
832
|
// The kind of work this member takes. A task names a discipline, and only
|
|
820
833
|
// agents holding it can be dispatched to it.
|
|
821
834
|
discipline: z6.string().min(1).max(CREW_DISCIPLINE_MAX),
|
|
@@ -827,10 +840,44 @@ var crewMemberSchema = z6.object({
|
|
|
827
840
|
face: crewFaceSchema
|
|
828
841
|
}).strict();
|
|
829
842
|
var CREW_ROSTER = [
|
|
843
|
+
// ── analysts and architects ─────────────────────────────────────────────────
|
|
844
|
+
{
|
|
845
|
+
callsign: "SOFIA",
|
|
846
|
+
group: "analyst-architect",
|
|
847
|
+
role: "business-analyst",
|
|
848
|
+
discipline: "business analyst",
|
|
849
|
+
tier: "deep",
|
|
850
|
+
face: { head: "gable", antenna: "stalk", eyes: "dots", mouth: "wave", ears: false }
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
callsign: "BEA",
|
|
854
|
+
group: "analyst-architect",
|
|
855
|
+
role: "business-analyst",
|
|
856
|
+
discipline: "business analyst",
|
|
857
|
+
tier: "standard",
|
|
858
|
+
face: { head: "gable", antenna: "none", eyes: "visor", mouth: "line", ears: false }
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
callsign: "WREN",
|
|
862
|
+
group: "analyst-architect",
|
|
863
|
+
role: "architect",
|
|
864
|
+
discipline: "solution architect",
|
|
865
|
+
tier: "deep",
|
|
866
|
+
face: { head: "gable", antenna: "dish", eyes: "bars", mouth: "line", ears: true }
|
|
867
|
+
},
|
|
868
|
+
{
|
|
869
|
+
callsign: "PEI",
|
|
870
|
+
group: "analyst-architect",
|
|
871
|
+
role: "architect",
|
|
872
|
+
discipline: "technical architect",
|
|
873
|
+
tier: "standard",
|
|
874
|
+
face: { head: "gable", antenna: "twin", eyes: "cyclops", mouth: "dots", ears: false }
|
|
875
|
+
},
|
|
830
876
|
// ── builders: code ──────────────────────────────────────────────────────────
|
|
831
877
|
{
|
|
832
878
|
callsign: "ADA",
|
|
833
879
|
group: "builder",
|
|
880
|
+
role: "builder",
|
|
834
881
|
discipline: "implementation",
|
|
835
882
|
tier: "deep",
|
|
836
883
|
face: { head: "sq", antenna: "stalk", eyes: "dots", mouth: "line", ears: false }
|
|
@@ -838,6 +885,7 @@ var CREW_ROSTER = [
|
|
|
838
885
|
{
|
|
839
886
|
callsign: "OTTO",
|
|
840
887
|
group: "builder",
|
|
888
|
+
role: "builder",
|
|
841
889
|
discipline: "implementation",
|
|
842
890
|
tier: "deep",
|
|
843
891
|
face: { head: "sq", antenna: "twin", eyes: "bars", mouth: "grid", ears: true }
|
|
@@ -845,6 +893,7 @@ var CREW_ROSTER = [
|
|
|
845
893
|
{
|
|
846
894
|
callsign: "MILO",
|
|
847
895
|
group: "builder",
|
|
896
|
+
role: "builder",
|
|
848
897
|
discipline: "implementation",
|
|
849
898
|
tier: "standard",
|
|
850
899
|
face: { head: "sqr", antenna: "stalk", eyes: "dots", mouth: "dots", ears: false }
|
|
@@ -852,42 +901,24 @@ var CREW_ROSTER = [
|
|
|
852
901
|
{
|
|
853
902
|
callsign: "NOVA",
|
|
854
903
|
group: "builder",
|
|
904
|
+
role: "builder",
|
|
855
905
|
discipline: "implementation",
|
|
856
906
|
tier: "standard",
|
|
857
907
|
face: { head: "sq", antenna: "dish", eyes: "cyclops", mouth: "line", ears: false }
|
|
858
908
|
},
|
|
859
|
-
{
|
|
860
|
-
callsign: "KAI",
|
|
861
|
-
group: "builder",
|
|
862
|
-
discipline: "implementation",
|
|
863
|
-
tier: "standard",
|
|
864
|
-
face: { head: "sqr", antenna: "none", eyes: "bars", mouth: "line", ears: true }
|
|
865
|
-
},
|
|
866
909
|
{
|
|
867
910
|
callsign: "HUGO",
|
|
868
911
|
group: "builder",
|
|
912
|
+
role: "builder",
|
|
869
913
|
discipline: "infrastructure",
|
|
870
914
|
tier: "standard",
|
|
871
915
|
face: { head: "sq", antenna: "twin", eyes: "dots", mouth: "grid", ears: true }
|
|
872
916
|
},
|
|
873
|
-
{
|
|
874
|
-
callsign: "WREN",
|
|
875
|
-
group: "builder",
|
|
876
|
-
discipline: "refactor",
|
|
877
|
-
tier: "fast",
|
|
878
|
-
face: { head: "sqr", antenna: "stalk", eyes: "bars", mouth: "wave", ears: false }
|
|
879
|
-
},
|
|
880
|
-
{
|
|
881
|
-
callsign: "PIP",
|
|
882
|
-
group: "builder",
|
|
883
|
-
discipline: "refactor",
|
|
884
|
-
tier: "fast",
|
|
885
|
-
face: { head: "sqr", antenna: "none", eyes: "dots", mouth: "dots", ears: false }
|
|
886
|
-
},
|
|
887
917
|
// ── builders: specs and docs ────────────────────────────────────────────────
|
|
888
918
|
{
|
|
889
919
|
callsign: "IRIS",
|
|
890
920
|
group: "builder",
|
|
921
|
+
role: "spec-writer",
|
|
891
922
|
discipline: "feature spec",
|
|
892
923
|
tier: "deep",
|
|
893
924
|
face: { head: "dome", antenna: "stalk", eyes: "visor", mouth: "line", ears: false }
|
|
@@ -895,6 +926,7 @@ var CREW_ROSTER = [
|
|
|
895
926
|
{
|
|
896
927
|
callsign: "JUNO",
|
|
897
928
|
group: "builder",
|
|
929
|
+
role: "spec-writer",
|
|
898
930
|
discipline: "feature spec",
|
|
899
931
|
tier: "standard",
|
|
900
932
|
face: { head: "dome", antenna: "none", eyes: "dots", mouth: "wave", ears: false }
|
|
@@ -902,6 +934,7 @@ var CREW_ROSTER = [
|
|
|
902
934
|
{
|
|
903
935
|
callsign: "LEX",
|
|
904
936
|
group: "builder",
|
|
937
|
+
role: "context-docs",
|
|
905
938
|
discipline: "context & docs",
|
|
906
939
|
tier: "fast",
|
|
907
940
|
face: { head: "dome", antenna: "twin", eyes: "bars", mouth: "dots", ears: false }
|
|
@@ -910,6 +943,7 @@ var CREW_ROSTER = [
|
|
|
910
943
|
{
|
|
911
944
|
callsign: "VERA",
|
|
912
945
|
group: "reviewer",
|
|
946
|
+
role: "spec-reviewer",
|
|
913
947
|
discipline: "spec consistency",
|
|
914
948
|
tier: "deep",
|
|
915
949
|
face: { head: "rnd", antenna: "stalk", eyes: "visor", mouth: "line", ears: false }
|
|
@@ -917,6 +951,7 @@ var CREW_ROSTER = [
|
|
|
917
951
|
{
|
|
918
952
|
callsign: "ODIN",
|
|
919
953
|
group: "reviewer",
|
|
954
|
+
role: "spec-reviewer",
|
|
920
955
|
discipline: "cross-spec audit",
|
|
921
956
|
tier: "deep",
|
|
922
957
|
face: { head: "rnd", antenna: "dish", eyes: "cyclops", mouth: "line", ears: false }
|
|
@@ -924,6 +959,7 @@ var CREW_ROSTER = [
|
|
|
924
959
|
{
|
|
925
960
|
callsign: "CASS",
|
|
926
961
|
group: "reviewer",
|
|
962
|
+
role: "code-test-reviewer",
|
|
927
963
|
discipline: "code review",
|
|
928
964
|
tier: "deep",
|
|
929
965
|
face: { head: "rnd", antenna: "none", eyes: "visor", mouth: "grid", ears: true }
|
|
@@ -931,13 +967,23 @@ var CREW_ROSTER = [
|
|
|
931
967
|
{
|
|
932
968
|
callsign: "THEO",
|
|
933
969
|
group: "reviewer",
|
|
970
|
+
role: "code-test-reviewer",
|
|
934
971
|
discipline: "code review",
|
|
935
972
|
tier: "standard",
|
|
936
973
|
face: { head: "rnd", antenna: "twin", eyes: "bars", mouth: "line", ears: false }
|
|
937
974
|
},
|
|
975
|
+
{
|
|
976
|
+
callsign: "KAI",
|
|
977
|
+
group: "reviewer",
|
|
978
|
+
role: "code-test-reviewer",
|
|
979
|
+
discipline: "code review",
|
|
980
|
+
tier: "standard",
|
|
981
|
+
face: { head: "rnd", antenna: "none", eyes: "bars", mouth: "line", ears: true }
|
|
982
|
+
},
|
|
938
983
|
{
|
|
939
984
|
callsign: "ECHO",
|
|
940
985
|
group: "reviewer",
|
|
986
|
+
role: "code-test-reviewer",
|
|
941
987
|
discipline: "test quality",
|
|
942
988
|
tier: "standard",
|
|
943
989
|
face: { head: "rnd", antenna: "stalk", eyes: "dots", mouth: "wave", ears: false }
|
|
@@ -945,6 +991,7 @@ var CREW_ROSTER = [
|
|
|
945
991
|
{
|
|
946
992
|
callsign: "MAVIS",
|
|
947
993
|
group: "reviewer",
|
|
994
|
+
role: "code-test-reviewer",
|
|
948
995
|
discipline: "suites & coverage",
|
|
949
996
|
tier: "standard",
|
|
950
997
|
face: { head: "rnd", antenna: "none", eyes: "visor", mouth: "dots", ears: false }
|
|
@@ -952,6 +999,7 @@ var CREW_ROSTER = [
|
|
|
952
999
|
{
|
|
953
1000
|
callsign: "ZARA",
|
|
954
1001
|
group: "reviewer",
|
|
1002
|
+
role: "code-test-reviewer",
|
|
955
1003
|
discipline: "smoke & walk aid",
|
|
956
1004
|
tier: "standard",
|
|
957
1005
|
face: { head: "rnd", antenna: "dish", eyes: "bars", mouth: "wave", ears: false }
|
|
@@ -959,39 +1007,31 @@ var CREW_ROSTER = [
|
|
|
959
1007
|
{
|
|
960
1008
|
callsign: "NORA",
|
|
961
1009
|
group: "reviewer",
|
|
1010
|
+
role: "code-test-reviewer",
|
|
962
1011
|
discipline: "evidence & provenance",
|
|
963
1012
|
tier: "fast",
|
|
964
1013
|
face: { head: "rnd", antenna: "twin", eyes: "dots", mouth: "line", ears: false }
|
|
965
1014
|
},
|
|
966
|
-
// ──
|
|
1015
|
+
// ── leads ───────────────────────────────────────────────────────────────────
|
|
967
1016
|
{
|
|
968
1017
|
callsign: "ARGUS",
|
|
969
|
-
group: "
|
|
970
|
-
|
|
1018
|
+
group: "lead",
|
|
1019
|
+
role: "quality-lead",
|
|
1020
|
+
discipline: "quality lead \xB7 every diff",
|
|
971
1021
|
tier: "standard",
|
|
972
1022
|
face: { head: "hex", antenna: "dish", eyes: "visor", mouth: "grid", ears: true }
|
|
973
1023
|
},
|
|
974
1024
|
{
|
|
975
1025
|
callsign: "ATLAS",
|
|
976
|
-
group: "
|
|
977
|
-
|
|
1026
|
+
group: "lead",
|
|
1027
|
+
role: "delivery-lead",
|
|
1028
|
+
discipline: "delivery lead",
|
|
978
1029
|
tier: "deep",
|
|
979
1030
|
face: { head: "hex", antenna: "twin", eyes: "cyclops", mouth: "line", ears: true }
|
|
980
1031
|
}
|
|
981
1032
|
];
|
|
982
1033
|
var CREW_ROSTER_SIZE = CREW_ROSTER.length;
|
|
983
1034
|
var CREW_CALLSIGNS = CREW_ROSTER.map((member) => member.callsign);
|
|
984
|
-
var crewRoleSchema = z6.enum([
|
|
985
|
-
"business-analyst",
|
|
986
|
-
"architect",
|
|
987
|
-
"spec-writer",
|
|
988
|
-
"builder",
|
|
989
|
-
"context-docs",
|
|
990
|
-
"spec-reviewer",
|
|
991
|
-
"code-test-reviewer",
|
|
992
|
-
"delivery-lead",
|
|
993
|
-
"quality-lead"
|
|
994
|
-
]);
|
|
995
1035
|
var crewLayerSchema = methodLayerSchema.extract(["l0", "l1", "l2", "l3", "l4", "l5"]);
|
|
996
1036
|
var crewRoleLayersSchema = z6.object({
|
|
997
1037
|
leads: z6.array(crewLayerSchema),
|
|
@@ -1349,14 +1389,13 @@ var SCOPE_STATE_NAMES = [
|
|
|
1349
1389
|
"waiting",
|
|
1350
1390
|
"sent-back",
|
|
1351
1391
|
"approved",
|
|
1352
|
-
"partly-stale"
|
|
1353
|
-
"withdrawn"
|
|
1392
|
+
"partly-stale"
|
|
1354
1393
|
];
|
|
1355
1394
|
var scopeStateNameSchema = z9.enum(SCOPE_STATE_NAMES);
|
|
1356
1395
|
var plannedScopeStateSchema = scopeStateNameSchema.exclude(["not-planned"]);
|
|
1357
1396
|
var SCOPE_PART_STATUSES = ["approved", "waiting"];
|
|
1358
1397
|
var scopePartStatusSchema = z9.enum(SCOPE_PART_STATUSES);
|
|
1359
|
-
var SCOPE_ACTS = ["approve", "send-back"
|
|
1398
|
+
var SCOPE_ACTS = ["approve", "send-back"];
|
|
1360
1399
|
var scopeActSchema = z9.enum(SCOPE_ACTS);
|
|
1361
1400
|
var SCOPE_GIVEN_IN = ["console", "chat"];
|
|
1362
1401
|
var scopeGivenInSchema = z9.enum(SCOPE_GIVEN_IN);
|
|
@@ -1427,14 +1466,9 @@ var scopeSendBackRequestSchema = z9.object({
|
|
|
1427
1466
|
parts: z9.array(scopeDecisionPartSchema).max(PHASE_PLAN_CHANGES_MAX),
|
|
1428
1467
|
note: scopeNoteWireSchema.optional()
|
|
1429
1468
|
}).strict();
|
|
1430
|
-
var scopeWithdrawRequestSchema = z9.object({
|
|
1431
|
-
act: z9.literal("withdraw"),
|
|
1432
|
-
planVersion: planVersionSchema
|
|
1433
|
-
}).strict();
|
|
1434
1469
|
var scopeDecisionRequestSchema = z9.discriminatedUnion("act", [
|
|
1435
1470
|
scopeApproveRequestSchema,
|
|
1436
|
-
scopeSendBackRequestSchema
|
|
1437
|
-
scopeWithdrawRequestSchema
|
|
1471
|
+
scopeSendBackRequestSchema
|
|
1438
1472
|
]);
|
|
1439
1473
|
var scopeDecisionRecordedSchema = z9.object({
|
|
1440
1474
|
outcome: z9.literal("recorded"),
|
|
@@ -1467,7 +1501,6 @@ var scopeDecisionResultSchema = z9.discriminatedUnion("outcome", [
|
|
|
1467
1501
|
reasonOutcome("not-owner"),
|
|
1468
1502
|
reasonOutcome("no-owner"),
|
|
1469
1503
|
reasonOutcome("plan-changed"),
|
|
1470
|
-
reasonOutcome("nothing-to-withdraw"),
|
|
1471
1504
|
reasonOutcome("build-started")
|
|
1472
1505
|
]);
|
|
1473
1506
|
var scopeReadPartSchema = z9.object({
|
|
@@ -2049,11 +2082,16 @@ var phaseReviewViewSchema = z13.discriminatedUnion("state", [
|
|
|
2049
2082
|
|
|
2050
2083
|
// ../events/dist/build-record-v3.js
|
|
2051
2084
|
var BUILD_RECORD_V3_FORMAT = "halfcycle-build-record/v3";
|
|
2085
|
+
var recordRoundStatedSchema = z14.object({
|
|
2086
|
+
actor: attestedCloseSchema.shape.actor,
|
|
2087
|
+
statements: attestedStatementsSchema
|
|
2088
|
+
}).strict();
|
|
2052
2089
|
var recordReviewRoundSchema = z14.object({
|
|
2053
2090
|
round: z14.number().int().min(1),
|
|
2054
2091
|
openedAt: utcIso8601,
|
|
2055
2092
|
verdict: walkVerdictSchema,
|
|
2056
|
-
findings: z14.number().int().min(0)
|
|
2093
|
+
findings: z14.number().int().min(0),
|
|
2094
|
+
stated: recordRoundStatedSchema.optional()
|
|
2057
2095
|
}).strict();
|
|
2058
2096
|
var recordReviewApprovalSchema = z14.discriminatedUnion("kind", [
|
|
2059
2097
|
z14.object({
|
|
@@ -2115,6 +2153,9 @@ var recordReviewSchema = z14.object({
|
|
|
2115
2153
|
if (r.round !== i + 1) {
|
|
2116
2154
|
ctx.addIssue({ code: "custom", path: ["rounds", i, "round"], message: "rounds must be numbered 1, 2, 3 \u2026 in order with no gap" });
|
|
2117
2155
|
}
|
|
2156
|
+
if (i === v.rounds.length - 1 && r.stated !== void 0) {
|
|
2157
|
+
ctx.addIssue({ code: "custom", path: ["rounds", i, "stated"], message: "the last round's words are the close's own, so the round does not repeat them" });
|
|
2158
|
+
}
|
|
2118
2159
|
});
|
|
2119
2160
|
const seen = /* @__PURE__ */ new Set();
|
|
2120
2161
|
v.parts.forEach((p, i) => {
|
|
@@ -5193,12 +5234,13 @@ function machines(coverage, checks) {
|
|
|
5193
5234
|
const line = `${label}${String(coverage.enrolled)}. Of these, ${String(coverage.conformant)} had reported Halfcycle's checks as fully set up.`;
|
|
5194
5235
|
return checks === "not-observed" && coverage.conformant > 0 ? `${line} Set up is not the same as running: Halfcycle has no record of any check running during this phase.` : line;
|
|
5195
5236
|
}
|
|
5196
|
-
function walkLines(walk, p) {
|
|
5237
|
+
function walkLines(walk, p, closingRound = false) {
|
|
5197
5238
|
const label = "> - Acceptance walk (the finished work tried as a user would, by someone other than its builder): ";
|
|
5198
5239
|
if (walk === null)
|
|
5199
5240
|
return [`${label}the person closing the phase reported none.`];
|
|
5241
|
+
const it = closingRound ? "the round that closed the phase" : "it";
|
|
5200
5242
|
const lines = [
|
|
5201
|
-
`${label}${walk.verdict === "clean" ?
|
|
5243
|
+
`${label}${walk.verdict === "clean" ? `the person closing the phase said ${it} found no problems.` : `the person closing the phase said ${it} found problems.`}`
|
|
5202
5244
|
];
|
|
5203
5245
|
walk.findings.forEach((finding, i) => {
|
|
5204
5246
|
lines.push(`> - Finding ${String(i + 1)}: ${p.text(finding)}`);
|
|
@@ -5217,12 +5259,12 @@ function decisionLine(attested) {
|
|
|
5217
5259
|
}
|
|
5218
5260
|
return attested.walk !== null && attested.walk.verdict === "defects" ? "> - Decision: close the phase as it stood, with the problems its acceptance walk found." : "> - Decision: the phase's agreed finish conditions were met.";
|
|
5219
5261
|
}
|
|
5220
|
-
function renderStated(attested, p) {
|
|
5262
|
+
function renderStated(attested, p, closingRound = false) {
|
|
5221
5263
|
const lines = [
|
|
5222
5264
|
decisionLine(attested),
|
|
5223
5265
|
`> - Name given: ${attested.actor === null ? "removed with the account that made this close" : p.text(attested.actor)}`,
|
|
5224
5266
|
`> - Reason given: ${attested.reason === null ? "none." : p.text(attested.reason)}`,
|
|
5225
|
-
...walkLines(attested.walk, p),
|
|
5267
|
+
...walkLines(attested.walk, p, closingRound),
|
|
5226
5268
|
`> - Code closed at (commit): ${statedOrNot(attested.closeCommit, p)}`,
|
|
5227
5269
|
`> - What the phase set out to prove: ${statedOrNot(attested.statements.thesis, p)}`,
|
|
5228
5270
|
`> - What came out of it: ${statedOrNot(attested.statements.outcome, p)}`
|
|
@@ -5238,7 +5280,7 @@ function renderStated(attested, p) {
|
|
|
5238
5280
|
}
|
|
5239
5281
|
return lines.join("\n");
|
|
5240
5282
|
}
|
|
5241
|
-
function renderClose(heading, observed, attested, checks, p) {
|
|
5283
|
+
function renderClose(heading, observed, attested, checks, p, closingRound = false) {
|
|
5242
5284
|
return [
|
|
5243
5285
|
heading,
|
|
5244
5286
|
headline(observed, attested, checks),
|
|
@@ -5250,7 +5292,7 @@ function renderClose(heading, observed, attested, checks, p) {
|
|
|
5250
5292
|
machines(observed.seatCoverage, checks)
|
|
5251
5293
|
].join("\n"),
|
|
5252
5294
|
STATED_LABEL,
|
|
5253
|
-
renderStated(attested, p)
|
|
5295
|
+
renderStated(attested, p, closingRound)
|
|
5254
5296
|
];
|
|
5255
5297
|
}
|
|
5256
5298
|
var REVIEW_LABEL = "**Recorded by Halfcycle from the owner's review.** Each part the review held, and how the project's owner decided it. A line marked as the agent's is the agent's own answer, not Halfcycle's.";
|
|
@@ -5266,7 +5308,7 @@ function decisionText(part, p) {
|
|
|
5266
5308
|
case "accepted":
|
|
5267
5309
|
return "Accepted";
|
|
5268
5310
|
case "carried":
|
|
5269
|
-
return part.carriedTo === null || part.carriedTo === void 0 ? `Carried to the next phase planned: ${p.text(part.reason ?? "")}` : `Carried to phase ${
|
|
5311
|
+
return part.carriedTo === null || part.carriedTo === void 0 ? `Carried to the next phase planned: ${p.text(part.reason ?? "")}` : `Carried to phase "${part.carriedTo.phase}": ${p.text(part.reason ?? "")}`;
|
|
5270
5312
|
case "dropped":
|
|
5271
5313
|
return `Dropped: ${p.text(part.reason ?? "")}`;
|
|
5272
5314
|
}
|
|
@@ -5299,6 +5341,37 @@ function renderReview(record2, p) {
|
|
|
5299
5341
|
blocks.push(removals);
|
|
5300
5342
|
return blocks;
|
|
5301
5343
|
}
|
|
5344
|
+
var EARLIER_ROUNDS_LABEL = `${STATED_LABEL} What was said each time the owner's review was asked for, before the round that closed the phase. What was said for that last round is under the close above. If the account that asked for a round is later deleted, the name given for that round is removed.`;
|
|
5345
|
+
function renderRoundStated(round, stated, p) {
|
|
5346
|
+
const label = "> - Acceptance walk (the finished work tried as a user would, by someone other than its builder): ";
|
|
5347
|
+
const walk = round.verdict === "clean" ? "the person asking for this round said it found no problems." : round.findings === 0 ? "the person asking for this round said it found problems." : `the person asking for this round said it found ${counted(round.findings, "problem", "problems")}.`;
|
|
5348
|
+
const lines = [
|
|
5349
|
+
`> - Name given: ${stated.actor === null ? "removed with the account that asked for this round" : p.text(stated.actor)}`,
|
|
5350
|
+
`${label}${walk}`,
|
|
5351
|
+
`> - What the phase set out to prove: ${statedOrNot(stated.statements.thesis, p)}`,
|
|
5352
|
+
`> - What came out of it: ${statedOrNot(stated.statements.outcome, p)}`
|
|
5353
|
+
];
|
|
5354
|
+
const deviations = stated.statements.deviations;
|
|
5355
|
+
if (deviations.length === 0) {
|
|
5356
|
+
lines.push("> - Changes from the plan: None stated by the client.");
|
|
5357
|
+
} else {
|
|
5358
|
+
lines.push("> - Changes from the plan:");
|
|
5359
|
+
deviations.forEach((deviation, i) => {
|
|
5360
|
+
lines.push(`> - Change ${String(i + 1)}: ${p.text(deviation)}`);
|
|
5361
|
+
});
|
|
5362
|
+
}
|
|
5363
|
+
return lines.join("\n");
|
|
5364
|
+
}
|
|
5365
|
+
function renderEarlierRounds(record2, p) {
|
|
5366
|
+
const rounds = record2.review.rounds;
|
|
5367
|
+
const blocks = [];
|
|
5368
|
+
for (const round of rounds) {
|
|
5369
|
+
if (round.stated === void 0)
|
|
5370
|
+
continue;
|
|
5371
|
+
blocks.push(`### Round ${String(round.round)} of ${String(rounds.length)}`, renderRoundStated(round, round.stated, p));
|
|
5372
|
+
}
|
|
5373
|
+
return blocks.length === 0 ? [] : ["## Earlier rounds of the review", EARLIER_ROUNDS_LABEL, ...blocks];
|
|
5374
|
+
}
|
|
5302
5375
|
function renderBuildRecordV2Markdown(record2) {
|
|
5303
5376
|
const p = makePrinter();
|
|
5304
5377
|
const attestedBySequence = /* @__PURE__ */ new Map();
|
|
@@ -5312,6 +5385,8 @@ function renderBuildRecordV2Markdown(record2) {
|
|
|
5312
5385
|
const closes = [...record2.observed.closes].sort((a, b) => a.sequence - b.sequence);
|
|
5313
5386
|
const total = closes.length;
|
|
5314
5387
|
const latest = closes[total - 1];
|
|
5388
|
+
const rounds = record2.format === "halfcycle-build-record/v3" ? record2.review.rounds : [];
|
|
5389
|
+
const roundsAfter = rounds.length <= 1 ? null : `after ${String(rounds.length)} rounds of the owner's review.${rounds.some((r) => r.stated !== void 0) ? ' What was said for each earlier round is under "Earlier rounds of the review".' : ""}`;
|
|
5315
5390
|
const body = [
|
|
5316
5391
|
`Phase: ${phase} (the name the client gave it)`,
|
|
5317
5392
|
OBSERVED_LABEL,
|
|
@@ -5320,12 +5395,12 @@ function renderBuildRecordV2Markdown(record2) {
|
|
|
5320
5395
|
`- Project identifier: ${p.text(record2.observed.engagementId)}. Halfcycle keeps this project's records under this identifier.`,
|
|
5321
5396
|
`- Record format: ${p.text(record2.format)}. This names the layout this file and the .json file beside it follow, for software that reads them.`
|
|
5322
5397
|
].join("\n"),
|
|
5323
|
-
total === 1 ? "This phase was closed once." : `This phase was closed ${String(total)} times. The latest close is described first; each earlier close follows, as it was recorded when it was made
|
|
5398
|
+
total === 1 ? roundsAfter === null ? "This phase was closed once." : `This phase was closed once, ${roundsAfter}` : `This phase was closed ${String(total)} times. The latest close is described first; each earlier close follows, as it was recorded when it was made.${roundsAfter === null ? "" : ` The latest close came ${roundsAfter}`}`,
|
|
5324
5399
|
...renderChecks(record2.observed.checks, p),
|
|
5325
|
-
...renderClose(total === 1 ? "## The close" : `## The latest close (close ${String(latest.sequence)} of ${String(total)})`, latest, attestedBySequence.get(latest.sequence), record2.observed.checks.state, p)
|
|
5400
|
+
...renderClose(total === 1 ? "## The close" : `## The latest close (close ${String(latest.sequence)} of ${String(total)})`, latest, attestedBySequence.get(latest.sequence), record2.observed.checks.state, p, rounds.length > 1)
|
|
5326
5401
|
];
|
|
5327
5402
|
if (record2.format === "halfcycle-build-record/v3")
|
|
5328
|
-
body.push(...renderReview(record2, p));
|
|
5403
|
+
body.push(...renderReview(record2, p), ...renderEarlierRounds(record2, p));
|
|
5329
5404
|
if (total > 1) {
|
|
5330
5405
|
body.push("## Earlier closes");
|
|
5331
5406
|
for (const close of closes.slice(0, -1)) {
|