@sjawhar/opencode-legion-envoy 3.17.1 → 3.18.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.
Files changed (2) hide show
  1. package/dist/src/server.js +64 -3
  2. package/package.json +1 -1
@@ -14363,6 +14363,8 @@ var EnvelopeSchema = exports_external.object({
14363
14363
  // ../contracts/src/handoff-schema.ts
14364
14364
  var HANDOFF_SCHEMA_VERSION = 1;
14365
14365
  var HANDOFF_PHASES = ["architect", "plan", "implement", "test", "review"];
14366
+ var PLAN_REVIEW_MAX_ROUNDS = 3;
14367
+ var PLAN_REVIEW_VERDICTS = ["approved", "rejected", "failed"];
14366
14368
  var isoTimestamp = exports_external.string().regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
14367
14369
  var handoffPhase = exports_external.enum(HANDOFF_PHASES);
14368
14370
  var nonEmpty = exports_external.string().trim().min(1);
@@ -14399,6 +14401,16 @@ var requiredSkillsSchema = exports_external.object({
14399
14401
  test: exports_external.array(exports_external.string()).optional(),
14400
14402
  review: exports_external.array(exports_external.string()).optional()
14401
14403
  }).passthrough().optional();
14404
+ var gapAnalysisSchema = exports_external.object({
14405
+ findings: exports_external.array(exports_external.object({ finding: exports_external.string(), answer: exports_external.string() }).passthrough()).optional(),
14406
+ error: exports_external.string().optional()
14407
+ }).passthrough().optional();
14408
+ var planReviewSchema = exports_external.object({
14409
+ verdict: exports_external.enum(PLAN_REVIEW_VERDICTS),
14410
+ rounds: exports_external.number(),
14411
+ remainingIssues: exports_external.array(exports_external.object({ issue: exports_external.string(), evidence: exports_external.string() }).passthrough()).optional(),
14412
+ error: exports_external.string().optional()
14413
+ }).passthrough().optional();
14402
14414
  var planSchema = baseHandoffSchema.extend({
14403
14415
  phase: exports_external.literal("plan"),
14404
14416
  taskCount: exports_external.number().optional(),
@@ -14406,7 +14418,9 @@ var planSchema = baseHandoffSchema.extend({
14406
14418
  routingHints: routingHintsSchema,
14407
14419
  concerns: exports_external.array(exports_external.string()).optional(),
14408
14420
  workflowRecommendation: exports_external.string().optional(),
14409
- requiredSkills: requiredSkillsSchema
14421
+ requiredSkills: requiredSkillsSchema,
14422
+ gapAnalysis: gapAnalysisSchema,
14423
+ planReview: planReviewSchema
14410
14424
  });
14411
14425
  var implementSchema = baseHandoffSchema.extend({
14412
14426
  phase: exports_external.literal("implement"),
@@ -14446,13 +14460,60 @@ var reviewSchema = baseHandoffSchema.extend({
14446
14460
  verdict: exports_external.enum(["approved", "changes_requested"]).optional(),
14447
14461
  keyFindings: exports_external.array(exports_external.object({ severity: exports_external.string(), file: exports_external.string(), description: exports_external.string() }).passthrough()).optional()
14448
14462
  });
14449
- var nonEmptySkillList = exports_external.array(exports_external.string().trim().min(1)).min(1);
14463
+ var nonEmptySkillList = exports_external.array(nonEmpty).min(1);
14464
+ var recorded = (shape, whatToRecord) => exports_external.object(shape, {
14465
+ error: (issue2) => issue2.input === undefined ? `missing \u2014 record ${whatToRecord}` : undefined
14466
+ }).passthrough();
14467
+ var gapAnalysisWriteSchema = recorded({
14468
+ findings: exports_external.array(exports_external.object({ finding: nonEmpty, answer: nonEmpty }).passthrough()).optional(),
14469
+ error: nonEmpty.optional()
14470
+ }, "the gap analyst's `findings`, each with how the plan answers it (`[]` when it found none), or its failed call's `error`").refine((analysis) => analysis.findings === undefined !== (analysis.error === undefined), {
14471
+ message: "record exactly one of `findings` or the failed call's `error`"
14472
+ });
14473
+ var planReviewWriteSchema = recorded({
14474
+ verdict: exports_external.enum(PLAN_REVIEW_VERDICTS),
14475
+ rounds: exports_external.number().int().min(1).max(PLAN_REVIEW_MAX_ROUNDS),
14476
+ remainingIssues: exports_external.array(exports_external.object({ issue: nonEmpty, evidence: nonEmpty }).passthrough()).optional(),
14477
+ error: nonEmpty.optional()
14478
+ }, "the plan review's `verdict` and `rounds`, with `remainingIssues` when it was rejected or `error` when a review's call failed").superRefine((review, ctx) => {
14479
+ const remaining = review.remainingIssues?.length ?? 0;
14480
+ if (review.verdict === "rejected" && remaining === 0) {
14481
+ ctx.addIssue({
14482
+ code: "custom",
14483
+ path: ["remainingIssues"],
14484
+ message: "a rejected review records the blocking issues its last round named"
14485
+ });
14486
+ }
14487
+ if (review.verdict === "rejected" && review.rounds < PLAN_REVIEW_MAX_ROUNDS) {
14488
+ ctx.addIssue({
14489
+ code: "custom",
14490
+ path: ["rounds"],
14491
+ message: `a review still rejecting after ${review.rounds} of ${PLAN_REVIEW_MAX_ROUNDS} rounds is revised and reviewed again, not recorded`
14492
+ });
14493
+ }
14494
+ if (review.verdict === "approved" && remaining > 0) {
14495
+ ctx.addIssue({
14496
+ code: "custom",
14497
+ path: ["remainingIssues"],
14498
+ message: "an approved review leaves no blocking issue standing"
14499
+ });
14500
+ }
14501
+ if (review.verdict === "failed" !== (review.error !== undefined)) {
14502
+ ctx.addIssue({
14503
+ code: "custom",
14504
+ path: ["error"],
14505
+ message: "a failed review records its call's error, and only a failed review does"
14506
+ });
14507
+ }
14508
+ });
14450
14509
  var planWriteSchema = planSchema.extend({
14451
14510
  requiredSkills: exports_external.object({
14452
14511
  implement: nonEmptySkillList,
14453
14512
  test: nonEmptySkillList,
14454
14513
  review: nonEmptySkillList
14455
- }).passthrough()
14514
+ }).passthrough(),
14515
+ gapAnalysis: gapAnalysisWriteSchema,
14516
+ planReview: planReviewWriteSchema
14456
14517
  });
14457
14518
  var phaseHandoffSchema = exports_external.discriminatedUnion("phase", [
14458
14519
  architectSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sjawhar/opencode-legion-envoy",
3
- "version": "3.17.1",
3
+ "version": "3.18.0",
4
4
  "type": "module",
5
5
  "main": "dist/src/server.js",
6
6
  "exports": {