halfcycle 0.9.0 → 0.11.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/bin/bin.bundle.mjs +1474 -869
- package/commands/agent-teams-orchestration.md +1 -1
- package/commands/consistency-check.md +1 -1
- package/commands/context-update.md +1 -1
- package/commands/halfcycle-design.md +1 -1
- package/commands/halfcycle-setup.md +1 -1
- package/commands/stack-assembly-worker.md +1 -1
- package/commands/task-execution.md +1 -1
- package/commands/task-graph.md +1 -1
- package/commands/write-spec.md +1 -1
- package/dist/bin.js +0 -0
- package/dist/build-record/render-v2.d.ts.map +1 -1
- package/dist/check-tasks.d.ts +28 -5
- package/dist/check-tasks.d.ts.map +1 -1
- package/dist/cli-contract.d.ts +1 -1
- package/dist/cli-contract.d.ts.map +1 -1
- package/dist/cli.js +2510 -1352
- package/dist/cli.js.map +3 -3
- package/dist/close-phase.d.ts +13 -10
- package/dist/close-phase.d.ts.map +1 -1
- package/dist/index.js +149 -69
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/local-allow.d.ts +108 -0
- package/dist/local-allow.d.ts.map +1 -0
- package/dist/open-phase.d.ts +8 -2
- package/dist/open-phase.d.ts.map +1 -1
- package/dist/pace.d.ts +11 -6
- package/dist/pace.d.ts.map +1 -1
- package/dist/review.d.ts +3 -2
- package/dist/review.d.ts.map +1 -1
- package/dist/size.d.ts +72 -0
- package/dist/size.d.ts.map +1 -0
- package/dist/uninstall.d.ts.map +1 -1
- package/package.json +11 -11
package/dist/close-phase.d.ts
CHANGED
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
* SHIPS TO CLIENT DISK inside the CLI: every string here is a sentence a person reads,
|
|
50
50
|
* and no comment sits beside an object member.
|
|
51
51
|
*/
|
|
52
|
-
import { PHASE_LIMIT_FILENAME, RELAYED_CHOICES_FILENAME, type PhaseExpected, type PhaseWork, unfinishedStepLine, type AcceptanceOutcome, type OwnerWaitDeclaration, type ObserveRunResult, type OpenReviewAnswer, type TimeRunResult, type TimeSummary, type WorkCall } from '@halfcycle/events';
|
|
52
|
+
import { PHASE_LIMIT_FILENAME, RELAYED_CHOICES_FILENAME, type PhaseExpected, type PhaseWork, unfinishedStepLine, type AcceptanceOutcome, type OwnerWaitDeclaration, type ObserveRunResult, type OpenReviewAnswer, type TimeRunResult, type TimeSummary, type TimeSummaryShare, type WorkCall } from '@halfcycle/events';
|
|
53
53
|
import type { RepoCredential } from './open-phase.js';
|
|
54
54
|
/**
|
|
55
55
|
* Whether the commit this phase closed at could be read, and if so the full hash
|
|
@@ -186,7 +186,7 @@ export declare function readTimeLine(stdout: string): TimeRunResult;
|
|
|
186
186
|
* answers, the open goes ahead; nothing is printed about it.
|
|
187
187
|
*
|
|
188
188
|
* It is the CLOSING send, so it passes `--final` (`time-and-usage-record` AC5): only
|
|
189
|
-
* this send settles a builder's held tokens on a task by the closing
|
|
189
|
+
* this send settles a builder's held tokens on a task by the closing terms, and what it
|
|
190
190
|
* settles stays settled even if the close is then refused. `pace` and the turn-end send
|
|
191
191
|
* never pass it.
|
|
192
192
|
*/
|
|
@@ -272,7 +272,7 @@ export declare function reviewOpenUrl(credential: RepoCredential, phase: string)
|
|
|
272
272
|
*
|
|
273
273
|
* @throws CloseRequestInvalid before anything is sent — no count, no time and no open — when the
|
|
274
274
|
* request fails the shared schema or the phase is not a phase name (the one
|
|
275
|
-
*
|
|
275
|
+
* check, `phaseNameSchema`); nothing else is thrown — every answer is an outcome.
|
|
276
276
|
*/
|
|
277
277
|
export declare function openPhaseReview(credential: RepoCredential, phase: string, request: CloseStepRequest, observe: () => Promise<ObserveRunResult>, repoRoot?: string, sendTime?: () => Promise<TimeRunResult>): Promise<ReviewOpenAttempt>;
|
|
278
278
|
/** CL1 — the review is open. */
|
|
@@ -350,10 +350,13 @@ export declare function readTimeTotalsUrl(credential: RepoCredential, phase: str
|
|
|
350
350
|
*/
|
|
351
351
|
export declare function readCloseTimeSummary(credential: RepoCredential, phase: string): Promise<TimeSummary | null>;
|
|
352
352
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
*
|
|
356
|
-
*
|
|
353
|
+
* The eight rows in two figures, then the lines under them, usage, reviews and kinds
|
|
354
|
+
* (time-totals AC7): T1, one `{row} {clock} · agents {agent}` line per row in
|
|
355
|
+
* `TIME_ROW_KEYS` order, T8, T3, T4, T9, U5–U7 or U3, A1, then B1–B2 when there are
|
|
356
|
+
* kinds. Then one line per task in graph order (its non-zero rows and T10), then T5, the
|
|
357
|
+
* "Not tied to a task" row, when it has figures. Every word comes from `packages/events`.
|
|
358
|
+
* With nothing to read (`summary` is `null`, or `timeSummaryIsEmpty`) it prints T1 then
|
|
359
|
+
* T6, exactly as the console shows the same case.
|
|
357
360
|
*
|
|
358
361
|
* Each task row prints `{task id} {title}` (coordinator ruling on issue #2061):
|
|
359
362
|
* `title` is attached by control's `readTimeSummary`, from the SAME stored graph the
|
|
@@ -362,7 +365,7 @@ export declare function readCloseTimeSummary(credential: RepoCredential, phase:
|
|
|
362
365
|
* `title` (the field is declared-optional on the wire): that row prints the task id
|
|
363
366
|
* alone rather than a missing word.
|
|
364
367
|
*/
|
|
365
|
-
export declare function timeTotalsLines(summary: TimeSummary | null): string[];
|
|
368
|
+
export declare function timeTotalsLines(summary: TimeSummary | null, details?: boolean): string[];
|
|
366
369
|
/**
|
|
367
370
|
* The address of a phase's declarations, this cycle only: `close-phase`'s own read
|
|
368
371
|
* (`fixed-list-and-one-sitting`, Component design, *Control*), the engagement
|
|
@@ -414,7 +417,7 @@ export declare function readPhaseExpected(engagementId: string, phase: string, h
|
|
|
414
417
|
* from Codex as relayed is not here (CX1 lists it). No file is the none-case of C1; a
|
|
415
418
|
* file that cannot be read or is another phase's prints nothing. Nothing is sent.
|
|
416
419
|
*/
|
|
417
|
-
export declare function phaseLimitLines(engagementId: string, phase: string, home?: string): string[];
|
|
420
|
+
export declare function phaseLimitLines(engagementId: string, phase: string, home?: string, share?: TimeSummaryShare | null, details?: boolean): string[];
|
|
418
421
|
/**
|
|
419
422
|
* One CX1 for each choice Codex relayed that let the phase use more, in the order they
|
|
420
423
|
* happened, from the relayed list on this machine. It reads nothing of the limit file, so
|
|
@@ -437,5 +440,5 @@ export declare function readPhaseModels(engagementId: string, phase: string, ope
|
|
|
437
440
|
* prints no Z1 and no Z3, a missing limit file the third Z2, an unreadable summary no
|
|
438
441
|
* Z2, and a missing tally no Z3. Nothing here stops the close.
|
|
439
442
|
*/
|
|
440
|
-
export declare function tierFigureLines(work: PhaseWork | null, expected: PhaseExpected | null, summary: TimeSummary | null, models: Readonly<Record<string, Readonly<Record<string, number>>>> | null): string[];
|
|
443
|
+
export declare function tierFigureLines(work: PhaseWork | null, expected: PhaseExpected | null, summary: TimeSummary | null, models: Readonly<Record<string, Readonly<Record<string, number>>>> | null, details?: boolean): string[];
|
|
441
444
|
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"close-phase.d.ts","sourceRoot":"","sources":["../src/close-phase.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1230,6 +1230,15 @@ var BUILD_TASK_BUDGET_MAX_MINUTES = 10080;
|
|
|
1230
1230
|
var BUILD_TASK_NOTE_MAX = 240;
|
|
1231
1231
|
var BUILD_TASK_CLEAR_COMMAND_MAX = 240;
|
|
1232
1232
|
var buildTaskKindSchema = z8.enum(["build", "review", "spec", "walk", "check"]);
|
|
1233
|
+
var BUILD_TASK_KIND_LABEL = Object.freeze({
|
|
1234
|
+
build: "Build",
|
|
1235
|
+
review: "Review",
|
|
1236
|
+
spec: "Spec",
|
|
1237
|
+
walk: "Walk",
|
|
1238
|
+
check: "Check"
|
|
1239
|
+
});
|
|
1240
|
+
var buildTaskShipsSchema = z8.enum(["deploy", "release"]);
|
|
1241
|
+
var BUILD_TASK_SHIPPED_MAX = 64;
|
|
1233
1242
|
var buildTaskIdSchema = z8.string().min(1).max(64);
|
|
1234
1243
|
var buildTaskSchema = z8.object({
|
|
1235
1244
|
// The task's own id, as the coordinator's graph names it.
|
|
@@ -1282,7 +1291,19 @@ var buildTaskSchema = z8.object({
|
|
|
1282
1291
|
clearCommand: descriptionText(BUILD_TASK_CLEAR_COMMAND_MAX).optional(),
|
|
1283
1292
|
// On a task held for a person, the crew member ready to take it on once it is
|
|
1284
1293
|
// cleared, by callsign. Absent when nobody is standing by.
|
|
1285
|
-
standingBy: agentNameSchema.optional()
|
|
1294
|
+
standingBy: agentNameSchema.optional(),
|
|
1295
|
+
// The batch this task was started in, counted from 0. A record of when it ran,
|
|
1296
|
+
// sent only once it has run; absent on a task not started yet.
|
|
1297
|
+
wave: z8.number().int().min(0).max(BUILD_SNAPSHOT_TASK_LIMIT).optional(),
|
|
1298
|
+
// True when the task is a check of the whole project rather than of one piece of
|
|
1299
|
+
// work. Absent otherwise; never false.
|
|
1300
|
+
wholeProject: z8.literal(true).optional(),
|
|
1301
|
+
// How the task ships what was built: deployed, or released. Absent on a task that
|
|
1302
|
+
// ships nothing.
|
|
1303
|
+
ships: buildTaskShipsSchema.optional(),
|
|
1304
|
+
// The commit or version the task reported when it shipped, exactly as reported, as
|
|
1305
|
+
// one word with no spaces. Absent until it has shipped, or when it reported none.
|
|
1306
|
+
shipped: z8.string().min(1).max(BUILD_TASK_SHIPPED_MAX).regex(/^[^\s\x00-\x1f\x7f-\x9f]*$/, { message: "must be one word, with no spaces or control characters" }).optional()
|
|
1286
1307
|
}).strict().superRefine((task, ctx) => {
|
|
1287
1308
|
if (task.reviews !== void 0 && task.reviews === task.id) {
|
|
1288
1309
|
ctx.addIssue({
|
|
@@ -2492,6 +2513,35 @@ var CREW_ROSTER = [
|
|
|
2492
2513
|
];
|
|
2493
2514
|
var CREW_ROSTER_SIZE = CREW_ROSTER.length;
|
|
2494
2515
|
var CREW_CALLSIGNS = CREW_ROSTER.map((member) => member.callsign);
|
|
2516
|
+
function crewMemberOf(callsign) {
|
|
2517
|
+
return CREW_ROSTER.find((member) => member.callsign === callsign);
|
|
2518
|
+
}
|
|
2519
|
+
var CREW_ROLE_SINGULAR = {
|
|
2520
|
+
"business-analyst": "business analyst",
|
|
2521
|
+
architect: "architect",
|
|
2522
|
+
"spec-writer": "spec writer",
|
|
2523
|
+
builder: "builder",
|
|
2524
|
+
"context-docs": "context and docs writer",
|
|
2525
|
+
"spec-reviewer": "spec reviewer",
|
|
2526
|
+
"code-test-reviewer": "code and test reviewer",
|
|
2527
|
+
"delivery-lead": "delivery lead",
|
|
2528
|
+
"quality-lead": "quality lead"
|
|
2529
|
+
};
|
|
2530
|
+
function crewNameWordsOf(name) {
|
|
2531
|
+
const member = crewMemberOf(name);
|
|
2532
|
+
return member === void 0 ? name : `${member.callsign}, ${CREW_ROLE_SINGULAR[member.role]}`;
|
|
2533
|
+
}
|
|
2534
|
+
var SMALL_CREW = Object.freeze([
|
|
2535
|
+
"SOFIA",
|
|
2536
|
+
"WREN",
|
|
2537
|
+
"ADA",
|
|
2538
|
+
"MILO",
|
|
2539
|
+
"IRIS",
|
|
2540
|
+
"LEX",
|
|
2541
|
+
"VERA",
|
|
2542
|
+
"CASS",
|
|
2543
|
+
"ATLAS"
|
|
2544
|
+
]);
|
|
2495
2545
|
var crewLayerSchema = methodLayerSchema.extract(["l0", "l1", "l2", "l3", "l4", "l5"]);
|
|
2496
2546
|
var crewRoleLayersSchema = z15.object({
|
|
2497
2547
|
leads: z15.array(crewLayerSchema),
|
|
@@ -3189,7 +3239,36 @@ var phaseRecordResponseSchema = z22.discriminatedUnion("outcome", [
|
|
|
3189
3239
|
]);
|
|
3190
3240
|
|
|
3191
3241
|
// ../events/dist/owner-waits.js
|
|
3242
|
+
import { z as z24 } from "zod";
|
|
3243
|
+
|
|
3244
|
+
// ../events/dist/owner-wait-answer.js
|
|
3192
3245
|
import { z as z23 } from "zod";
|
|
3246
|
+
var ownerWaitShortIdSchema = z23.string().regex(/^[0-9a-f]{8}$/);
|
|
3247
|
+
var OWNER_WAIT_ANSWER_ACTS = ["approve", "decline"];
|
|
3248
|
+
var ownerWaitAnswerActSchema = z23.enum(OWNER_WAIT_ANSWER_ACTS);
|
|
3249
|
+
var ownerWaitChatRequestSchema = z23.discriminatedUnion("act", [
|
|
3250
|
+
z23.object({ act: z23.literal("approve"), wait: ownerWaitShortIdSchema }).strict(),
|
|
3251
|
+
z23.object({ act: z23.literal("decline"), wait: ownerWaitShortIdSchema, note: scopeNoteWireSchema }).strict()
|
|
3252
|
+
]);
|
|
3253
|
+
function bareOutcome(outcome) {
|
|
3254
|
+
return z23.object({ outcome: z23.literal(outcome) }).strict();
|
|
3255
|
+
}
|
|
3256
|
+
var ownerWaitChatResultSchema = z23.discriminatedUnion("outcome", [
|
|
3257
|
+
z23.object({
|
|
3258
|
+
outcome: z23.literal("recorded"),
|
|
3259
|
+
act: ownerWaitAnswerActSchema,
|
|
3260
|
+
question: z23.string().min(1)
|
|
3261
|
+
}).strict(),
|
|
3262
|
+
z23.object({ outcome: z23.literal("refused"), problems: z23.array(systemDescriptionProblemSchema).min(1) }).strict(),
|
|
3263
|
+
bareOutcome("not-owner"),
|
|
3264
|
+
bareOutcome("no-owner"),
|
|
3265
|
+
bareOutcome("not-found"),
|
|
3266
|
+
bareOutcome("ambiguous"),
|
|
3267
|
+
bareOutcome("not-offered"),
|
|
3268
|
+
bareOutcome("unavailable")
|
|
3269
|
+
]);
|
|
3270
|
+
|
|
3271
|
+
// ../events/dist/owner-waits.js
|
|
3193
3272
|
var OWNER_WAIT_ITEMS = Object.freeze([
|
|
3194
3273
|
Object.freeze({ id: "delete-users-data", words: "Deleting or replacing data people already have." }),
|
|
3195
3274
|
Object.freeze({
|
|
@@ -3202,27 +3281,27 @@ var OWNER_WAIT_ITEMS = Object.freeze([
|
|
|
3202
3281
|
Object.freeze({ id: "change-standing-rule", words: "Changing a standing rule." })
|
|
3203
3282
|
]);
|
|
3204
3283
|
var OWNER_WAIT_ITEM_IDS = Object.freeze(OWNER_WAIT_ITEMS.map((item) => item.id));
|
|
3205
|
-
var ownerWaitItemIdSchema =
|
|
3284
|
+
var ownerWaitItemIdSchema = z24.enum(OWNER_WAIT_ITEM_IDS);
|
|
3206
3285
|
var OWNER_WAIT_FIXED_COUNT = OWNER_WAIT_ITEMS.length;
|
|
3207
3286
|
var OWNER_WAIT_ADDITIONS_MAX = 20;
|
|
3208
3287
|
var OWNER_WAIT_TEXT_MAX = 240;
|
|
3209
|
-
var ownerWaitItemRefSchema =
|
|
3210
|
-
|
|
3211
|
-
|
|
3288
|
+
var ownerWaitItemRefSchema = z24.union([
|
|
3289
|
+
z24.number().int().min(1),
|
|
3290
|
+
z24.string().uuid({ message: "must be a number from 1 to 6, or the id shown beside an added item" })
|
|
3212
3291
|
]);
|
|
3213
3292
|
var ownerWaitText = descriptionText(OWNER_WAIT_TEXT_MAX);
|
|
3214
|
-
var ownerWaitAddRequestSchema =
|
|
3215
|
-
engagementId:
|
|
3293
|
+
var ownerWaitAddRequestSchema = z24.object({
|
|
3294
|
+
engagementId: z24.string().min(1),
|
|
3216
3295
|
text: ownerWaitText,
|
|
3217
3296
|
reason: ownerWaitText
|
|
3218
3297
|
}).strict();
|
|
3219
|
-
var ownerWaitAddResultSchema =
|
|
3220
|
-
|
|
3221
|
-
|
|
3298
|
+
var ownerWaitAddResultSchema = z24.discriminatedUnion("outcome", [
|
|
3299
|
+
z24.object({ outcome: z24.literal("added"), id: z24.string().uuid(), addedAt: utcIso8601 }).strict(),
|
|
3300
|
+
z24.object({ outcome: z24.literal("refused"), reason: z24.literal("too-many") }).strict()
|
|
3222
3301
|
]);
|
|
3223
|
-
var ownerWaitUndoableSchema =
|
|
3224
|
-
var ownerWaitDeclareRequestSchema =
|
|
3225
|
-
engagementId:
|
|
3302
|
+
var ownerWaitUndoableSchema = z24.enum(["yes", "no"]);
|
|
3303
|
+
var ownerWaitDeclareRequestSchema = z24.object({
|
|
3304
|
+
engagementId: z24.string().min(1),
|
|
3226
3305
|
item: ownerWaitItemRefSchema,
|
|
3227
3306
|
question: ownerWaitText,
|
|
3228
3307
|
recommendation: ownerWaitText,
|
|
@@ -3235,68 +3314,49 @@ var ownerWaitDeclareRequestSchema = z23.object({
|
|
|
3235
3314
|
path: ["how"]
|
|
3236
3315
|
});
|
|
3237
3316
|
var OWNER_WAIT_DECLARE_REFUSALS = ["no-open-phase", "unknown-item", "say-if-undoable"];
|
|
3238
|
-
var ownerWaitDeclareResultSchema =
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
outcome:
|
|
3242
|
-
id:
|
|
3243
|
-
callId:
|
|
3244
|
-
say:
|
|
3317
|
+
var ownerWaitDeclareResultSchema = z24.discriminatedUnion("outcome", [
|
|
3318
|
+
z24.object({ outcome: z24.literal("recorded"), id: z24.string().uuid(), say: z24.string().min(1) }).strict(),
|
|
3319
|
+
z24.object({
|
|
3320
|
+
outcome: z24.literal("go-ahead"),
|
|
3321
|
+
id: z24.string().uuid(),
|
|
3322
|
+
callId: z24.number().int().positive(),
|
|
3323
|
+
say: z24.string().min(1)
|
|
3245
3324
|
}).strict(),
|
|
3246
|
-
|
|
3325
|
+
z24.object({ outcome: z24.literal("refused"), reason: z24.enum(OWNER_WAIT_DECLARE_REFUSALS) }).strict()
|
|
3247
3326
|
]);
|
|
3248
|
-
var ownerWaitAddedItemSchema =
|
|
3249
|
-
id:
|
|
3250
|
-
words:
|
|
3251
|
-
reason:
|
|
3327
|
+
var ownerWaitAddedItemSchema = z24.object({
|
|
3328
|
+
id: z24.string().uuid(),
|
|
3329
|
+
words: z24.string().min(1),
|
|
3330
|
+
reason: z24.string().min(1),
|
|
3252
3331
|
addedAt: utcIso8601
|
|
3253
3332
|
}).strict();
|
|
3254
|
-
var ownerWaitListSchema =
|
|
3255
|
-
fixed:
|
|
3256
|
-
added:
|
|
3333
|
+
var ownerWaitListSchema = z24.object({
|
|
3334
|
+
fixed: z24.array(z24.object({ id: ownerWaitItemIdSchema, words: z24.string().min(1) }).strict()).length(OWNER_WAIT_FIXED_COUNT),
|
|
3335
|
+
added: z24.array(ownerWaitAddedItemSchema).max(OWNER_WAIT_ADDITIONS_MAX)
|
|
3257
3336
|
}).strict();
|
|
3258
|
-
var ownerWaitDeclarationSchema =
|
|
3259
|
-
id:
|
|
3337
|
+
var ownerWaitDeclarationSchema = z24.object({
|
|
3338
|
+
id: z24.string().uuid(),
|
|
3260
3339
|
fixedItem: ownerWaitItemIdSchema.nullable(),
|
|
3261
|
-
addition:
|
|
3262
|
-
question:
|
|
3263
|
-
recommendation:
|
|
3340
|
+
addition: z24.object({ id: z24.string().uuid(), words: z24.string().min(1) }).strict().nullable(),
|
|
3341
|
+
question: z24.string().min(1),
|
|
3342
|
+
recommendation: z24.string().min(1),
|
|
3264
3343
|
task: buildTaskIdSchema.nullable(),
|
|
3265
3344
|
declaredAt: utcIso8601
|
|
3266
3345
|
}).strict().refine((d) => d.fixedItem === null !== (d.addition === null), {
|
|
3267
3346
|
message: "names exactly one item: a fixed one or an added one",
|
|
3268
3347
|
path: ["fixedItem"]
|
|
3269
3348
|
});
|
|
3270
|
-
var ownerWaitDeclarationsSchema =
|
|
3349
|
+
var ownerWaitDeclarationsSchema = z24.object({ declarations: z24.array(ownerWaitDeclarationSchema) }).strict();
|
|
3350
|
+
var ownerWaitOpenSchema = z24.object({
|
|
3351
|
+
wait: ownerWaitShortIdSchema,
|
|
3352
|
+
task: buildTaskIdSchema.nullable(),
|
|
3353
|
+
question: z24.string().min(1),
|
|
3354
|
+
recommendation: z24.string().min(1),
|
|
3355
|
+
declaredAt: utcIso8601
|
|
3356
|
+
}).strict();
|
|
3357
|
+
var ownerWaitsOpenSchema = z24.object({ waits: z24.array(ownerWaitOpenSchema) }).strict();
|
|
3271
3358
|
var OWNER_WAIT_TOO_MANY = `This project already has ${String(OWNER_WAIT_ADDITIONS_MAX)} things added to what waits for the owner. Ask the owner to take one off on their settings page in the console first; it cannot be done by typing in chat.`;
|
|
3272
3359
|
|
|
3273
|
-
// ../events/dist/owner-wait-answer.js
|
|
3274
|
-
import { z as z24 } from "zod";
|
|
3275
|
-
var ownerWaitShortIdSchema = z24.string().regex(/^[0-9a-f]{8}$/);
|
|
3276
|
-
var OWNER_WAIT_ANSWER_ACTS = ["approve", "decline"];
|
|
3277
|
-
var ownerWaitAnswerActSchema = z24.enum(OWNER_WAIT_ANSWER_ACTS);
|
|
3278
|
-
var ownerWaitChatRequestSchema = z24.discriminatedUnion("act", [
|
|
3279
|
-
z24.object({ act: z24.literal("approve"), wait: ownerWaitShortIdSchema }).strict(),
|
|
3280
|
-
z24.object({ act: z24.literal("decline"), wait: ownerWaitShortIdSchema, note: scopeNoteWireSchema }).strict()
|
|
3281
|
-
]);
|
|
3282
|
-
function bareOutcome(outcome) {
|
|
3283
|
-
return z24.object({ outcome: z24.literal(outcome) }).strict();
|
|
3284
|
-
}
|
|
3285
|
-
var ownerWaitChatResultSchema = z24.discriminatedUnion("outcome", [
|
|
3286
|
-
z24.object({
|
|
3287
|
-
outcome: z24.literal("recorded"),
|
|
3288
|
-
act: ownerWaitAnswerActSchema,
|
|
3289
|
-
question: z24.string().min(1)
|
|
3290
|
-
}).strict(),
|
|
3291
|
-
z24.object({ outcome: z24.literal("refused"), problems: z24.array(systemDescriptionProblemSchema).min(1) }).strict(),
|
|
3292
|
-
bareOutcome("not-owner"),
|
|
3293
|
-
bareOutcome("no-owner"),
|
|
3294
|
-
bareOutcome("not-found"),
|
|
3295
|
-
bareOutcome("ambiguous"),
|
|
3296
|
-
bareOutcome("not-offered"),
|
|
3297
|
-
bareOutcome("unavailable")
|
|
3298
|
-
]);
|
|
3299
|
-
|
|
3300
3360
|
// ../events/dist/autonomy.js
|
|
3301
3361
|
import { z as z25 } from "zod";
|
|
3302
3362
|
var AUTONOMY_CHANGED_IN = ["console", "chat"];
|
|
@@ -3469,10 +3529,17 @@ function autonomyC8(agent, question, chose) {
|
|
|
3469
3529
|
var CALLS_HEADING = "Calls made without asking you";
|
|
3470
3530
|
var CALLS_EXPLAINED = "These are the decisions the agents recorded taking on their own, each against a stated default. Halfcycle lists what they recorded; it cannot see a call an agent did not record.";
|
|
3471
3531
|
function callMadeLine(call) {
|
|
3472
|
-
return `${call.by} decided "${call.question}": chose "${call.chose}". The stated default was "${call.statedDefault}".`;
|
|
3532
|
+
return `${crewNameWordsOf(call.by)} decided "${call.question}": chose "${call.chose}". The stated default was "${call.statedDefault}".`;
|
|
3533
|
+
}
|
|
3534
|
+
function listedCallLine(call) {
|
|
3535
|
+
return autonomyC8(crewNameWordsOf(call.by), call.question, call.chose);
|
|
3536
|
+
}
|
|
3537
|
+
function callHeadLineOf(call) {
|
|
3538
|
+
return call.kind === "listed" ? listedCallLine(call) : callMadeLine(call);
|
|
3473
3539
|
}
|
|
3474
3540
|
function callUndoLine(call) {
|
|
3475
|
-
|
|
3541
|
+
const by = crewNameWordsOf(call.by);
|
|
3542
|
+
return call.undoable === "yes" ? `${by} says this can be undone: "${call.how ?? ""}"` : `${by} says this cannot be undone.`;
|
|
3476
3543
|
}
|
|
3477
3544
|
var NO_CALLS_LINE = "No agent recorded a call made without asking in this phase.";
|
|
3478
3545
|
var UNCHECKED_CLAIMS_HEADING = "Checks nobody ran";
|
|
@@ -6049,8 +6116,8 @@ ${GENERATED_USER_PROMPT_SCOPE_HEADER} the Halfcycle installer, now also for the
|
|
|
6049
6116
|
# number ("allow 2"), as the whole prompt, and change
|
|
6050
6117
|
# how a build is paced, by typing "faster", "run 5 agents", "keep 30% free" or
|
|
6051
6118
|
# "use up to 70%" as the whole prompt, and answer a phase's usage limit by
|
|
6052
|
-
# typing "keep going", "stop", "limit it to 1.5 times" or "limit it to
|
|
6053
|
-
#
|
|
6119
|
+
# typing "keep going", "stop", "limit it to 1.5 times" or "limit it to 10% of
|
|
6120
|
+
# the week" as the whole prompt.
|
|
6054
6121
|
#
|
|
6055
6122
|
# AN ORDINARY PROMPT STARTS NOTHING. This script reads the hook input once and
|
|
6056
6123
|
# looks only at the start of the prompt's value. Unless the prompt begins, after
|
|
@@ -6085,7 +6152,7 @@ IFS= read -r -d '' HC_INPUT || true
|
|
|
6085
6152
|
# \\u escape, or as the UTF-8 bytes of a Unicode space. Compared byte for byte.
|
|
6086
6153
|
HC_LEAD='[[:space:]]|\\\\[nrtf]|\\\\u(000[9a-d]|0020|00a0|1680|200[0-9a]|202[89f]|205f|3000|feff)'
|
|
6087
6154
|
HC_LEAD="$HC_LEAD|"$'\\xc2\\xa0|\\xe1\\x9a\\x80|\\xe2\\x80[\\x80-\\x8a\\xa8\\xa9\\xaf]|\\xe2\\x81\\x9f|\\xe3\\x80\\x80|\\xef\\xbb\\xbf'
|
|
6088
|
-
if ! printf '%s' "$HC_INPUT" | LC_ALL=C grep -Eiq "\\"prompt\\"[[:space:]]*:[[:space:]]*\\"($HC_LEAD)*((approve|send back|accept|question|carry|drop|reject|autonomy|decline) |allow( +[0-9]{1,4})?($HC_LEAD)*\\"|(faster|go faster|run [0-9]{1,3} agents?|keep [0-9]{1,3}% free|use up to [0-9]{1,3}%|keep going|stop|stop here|limit it to [0-9]{1,9}(\\.[0-9]{1,2})? (times|million|billion|million tokens|billion tokens))($HC_LEAD)*\\")"; then
|
|
6155
|
+
if ! printf '%s' "$HC_INPUT" | LC_ALL=C grep -Eiq "\\"prompt\\"[[:space:]]*:[[:space:]]*\\"($HC_LEAD)*((approve|send back|accept|question|carry|drop|reject|autonomy|decline) |allow( +[0-9]{1,4})?($HC_LEAD)*\\"|(faster|go faster|run [0-9]{1,3} agents?|keep [0-9]{1,3}% free|use up to [0-9]{1,3}%|keep going|stop|stop here|limit it to [0-9]{1,9}(\\.[0-9]{1,2})? (times|million|billion|million tokens|billion tokens)|limit it to [0-9]{1,3}% of the week)($HC_LEAD)*\\")"; then
|
|
6089
6156
|
exit 0
|
|
6090
6157
|
fi
|
|
6091
6158
|
|
|
@@ -6525,7 +6592,9 @@ var REQUIRED_GITIGNORE_ENTRIES = [
|
|
|
6525
6592
|
".halfcycle/state.json",
|
|
6526
6593
|
`${ZONE_B_DIR}/`,
|
|
6527
6594
|
".claude/worktrees/",
|
|
6528
|
-
".halfcycle/context-budget.json"
|
|
6595
|
+
".halfcycle/context-budget.json",
|
|
6596
|
+
".claude/settings.local.json",
|
|
6597
|
+
".halfcycle/local-allow.json"
|
|
6529
6598
|
];
|
|
6530
6599
|
var GITIGNORE_HEADER = "# Halfcycle \u2014 machine-local secrets/state and Zone-B (never push to client remote)";
|
|
6531
6600
|
function adoptBlockUnderHeader(before, header, claimable) {
|
|
@@ -8389,9 +8458,14 @@ function renderCalls(calls, p) {
|
|
|
8389
8458
|
if (calls.length === 0)
|
|
8390
8459
|
return [`## ${CALLS_HEADING}`, NO_CALLS_LINE];
|
|
8391
8460
|
const lines = calls.flatMap((c) => {
|
|
8392
|
-
const by = p.itemStart(c.by);
|
|
8393
8461
|
const undo = ` - ${callUndoLine({ by: p.text(c.by), undoable: c.undoable, how: c.how === null ? null : p.text(c.how) })}`;
|
|
8394
|
-
const head =
|
|
8462
|
+
const head = callHeadLineOf({
|
|
8463
|
+
kind: c.kind,
|
|
8464
|
+
by: p.itemStart(c.by),
|
|
8465
|
+
question: p.text(c.question),
|
|
8466
|
+
chose: p.text(c.chose),
|
|
8467
|
+
statedDefault: p.text(c.statedDefault)
|
|
8468
|
+
});
|
|
8395
8469
|
return [`- ${head}`, undo];
|
|
8396
8470
|
});
|
|
8397
8471
|
return [`## ${CALLS_HEADING}`, CALLS_EXPLAINED, lines.join("\n")];
|
|
@@ -8690,6 +8764,12 @@ var REVIEW_USAGE = `${HALFCYCLE_COMMAND} review <phase> (--show | --answer <part
|
|
|
8690
8764
|
var RV9_LINE = `halfcycle review: this project is not signed in on this computer. ${HOOK_REMEDY}`;
|
|
8691
8765
|
|
|
8692
8766
|
// dist/open-phase.js
|
|
8767
|
+
var OPEN_FROM_SIZE_REFUSALS = Object.freeze({
|
|
8768
|
+
"unknown-size": "That size id is not this project's. Use the id `size sort` printed. Nothing was opened.",
|
|
8769
|
+
"not-small": "Only a small project is opened from its size. Nothing was opened.",
|
|
8770
|
+
"size-used": "That size has already opened a phase. Nothing was opened.",
|
|
8771
|
+
"only-up": "A project never moves to a smaller size. Nothing was opened."
|
|
8772
|
+
});
|
|
8693
8773
|
function writePhaseStamp(engagementId, phase, home) {
|
|
8694
8774
|
if (!isEngagementId(engagementId)) {
|
|
8695
8775
|
return { path: "(none \u2014 no valid project id)", reason: new InvalidEngagementIdError(engagementId).message };
|