planpong 0.4.2 → 0.5.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 (55) hide show
  1. package/dist/src/config/defaults.js +1 -0
  2. package/dist/src/config/defaults.js.map +1 -1
  3. package/dist/src/config/loader.d.ts +1 -0
  4. package/dist/src/config/loader.js +3 -0
  5. package/dist/src/config/loader.js.map +1 -1
  6. package/dist/src/core/apply-edits.d.ts +40 -0
  7. package/dist/src/core/apply-edits.js +220 -0
  8. package/dist/src/core/apply-edits.js.map +1 -0
  9. package/dist/src/core/convergence.d.ts +18 -2
  10. package/dist/src/core/convergence.js +21 -9
  11. package/dist/src/core/convergence.js.map +1 -1
  12. package/dist/src/core/operations.d.ts +14 -1
  13. package/dist/src/core/operations.js +551 -62
  14. package/dist/src/core/operations.js.map +1 -1
  15. package/dist/src/core/plan-diff.d.ts +23 -0
  16. package/dist/src/core/plan-diff.js +135 -0
  17. package/dist/src/core/plan-diff.js.map +1 -0
  18. package/dist/src/core/session.d.ts +11 -0
  19. package/dist/src/core/session.js +51 -1
  20. package/dist/src/core/session.js.map +1 -1
  21. package/dist/src/mcp/tools/get-feedback.d.ts +16 -0
  22. package/dist/src/mcp/tools/get-feedback.js +118 -114
  23. package/dist/src/mcp/tools/get-feedback.js.map +1 -1
  24. package/dist/src/mcp/tools/revise.d.ts +16 -0
  25. package/dist/src/mcp/tools/revise.js +76 -61
  26. package/dist/src/mcp/tools/revise.js.map +1 -1
  27. package/dist/src/mcp/tools/status.js +15 -1
  28. package/dist/src/mcp/tools/status.js.map +1 -1
  29. package/dist/src/prompts/planner.d.ts +34 -1
  30. package/dist/src/prompts/planner.js +239 -4
  31. package/dist/src/prompts/planner.js.map +1 -1
  32. package/dist/src/prompts/reviewer.d.ts +13 -0
  33. package/dist/src/prompts/reviewer.js +65 -0
  34. package/dist/src/prompts/reviewer.js.map +1 -1
  35. package/dist/src/providers/claude.js +19 -3
  36. package/dist/src/providers/claude.js.map +1 -1
  37. package/dist/src/providers/codex.js +50 -3
  38. package/dist/src/providers/codex.js.map +1 -1
  39. package/dist/src/providers/types.d.ts +20 -0
  40. package/dist/src/schemas/config.d.ts +3 -0
  41. package/dist/src/schemas/config.js +6 -0
  42. package/dist/src/schemas/config.js.map +1 -1
  43. package/dist/src/schemas/json-schema.d.ts +12 -0
  44. package/dist/src/schemas/json-schema.js +20 -1
  45. package/dist/src/schemas/json-schema.js.map +1 -1
  46. package/dist/src/schemas/metrics.d.ts +171 -0
  47. package/dist/src/schemas/metrics.js +49 -0
  48. package/dist/src/schemas/metrics.js.map +1 -0
  49. package/dist/src/schemas/revision.d.ts +166 -2
  50. package/dist/src/schemas/revision.js +35 -2
  51. package/dist/src/schemas/revision.js.map +1 -1
  52. package/dist/src/schemas/session.d.ts +6 -0
  53. package/dist/src/schemas/session.js +10 -0
  54. package/dist/src/schemas/session.js.map +1 -1
  55. package/package.json +1 -1
@@ -42,6 +42,7 @@ export declare const PlanpongConfigSchema: z.ZodObject<{
42
42
  plans_dir: z.ZodDefault<z.ZodString>;
43
43
  max_rounds: z.ZodDefault<z.ZodNumber>;
44
44
  human_in_loop: z.ZodDefault<z.ZodBoolean>;
45
+ revision_mode: z.ZodDefault<z.ZodEnum<["edits", "full"]>>;
45
46
  }, "strip", z.ZodTypeAny, {
46
47
  planner: {
47
48
  provider: string;
@@ -56,6 +57,7 @@ export declare const PlanpongConfigSchema: z.ZodObject<{
56
57
  plans_dir: string;
57
58
  max_rounds: number;
58
59
  human_in_loop: boolean;
60
+ revision_mode: "edits" | "full";
59
61
  }, {
60
62
  planner: {
61
63
  provider: string;
@@ -70,6 +72,7 @@ export declare const PlanpongConfigSchema: z.ZodObject<{
70
72
  plans_dir?: string | undefined;
71
73
  max_rounds?: number | undefined;
72
74
  human_in_loop?: boolean | undefined;
75
+ revision_mode?: "edits" | "full" | undefined;
73
76
  }>;
74
77
  export type ProviderConfig = z.infer<typeof ProviderConfigSchema>;
75
78
  export type PlanpongConfig = z.infer<typeof PlanpongConfigSchema>;
@@ -10,5 +10,11 @@ export const PlanpongConfigSchema = z.object({
10
10
  plans_dir: z.string().default("docs/plans"),
11
11
  max_rounds: z.number().int().min(1).max(50).default(10),
12
12
  human_in_loop: z.boolean().default(true),
13
+ // Initial release defaults to `"full"`. Edits mode is opt-in via
14
+ // planpong.yaml until benchmark thresholds (first-pass success ≥80%,
15
+ // retry rate <30%, no rounds increase) are confirmed. `"full"` is the
16
+ // kill switch — risk + detail phases use the direction-phase schema and
17
+ // skip the edit applier entirely.
18
+ revision_mode: z.enum(["edits", "full"]).default("full"),
13
19
  });
14
20
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/schemas/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,oBAAoB;IAC7B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACzC,CAAC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/schemas/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,oBAAoB;IAC7B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACxC,iEAAiE;IACjE,qEAAqE;IACrE,sEAAsE;IACtE,wEAAwE;IACxE,kCAAkC;IAClC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACzD,CAAC,CAAC"}
@@ -7,3 +7,15 @@ export declare const PlannerRevisionJsonSchema: Record<string, unknown>;
7
7
  * Get the JSON Schema appropriate for a given review phase.
8
8
  */
9
9
  export declare function getFeedbackJsonSchemaForPhase(phase: ReviewPhase): Record<string, unknown>;
10
+ /**
11
+ * Get the JSON Schema for a planner revision response, selecting the
12
+ * shape based on phase and the configured revision mode.
13
+ *
14
+ * - Direction phase always emits `updated_plan` (sweeping rewrites are
15
+ * allowed in round 1).
16
+ * - Risk + detail phase with `revisionMode: "edits"` emits an `edits[]`
17
+ * array — the planner cannot fall back to full output.
18
+ * - Risk + detail phase with `revisionMode: "full"` keeps the full-plan
19
+ * shape (kill switch).
20
+ */
21
+ export declare function getRevisionJsonSchema(phase: ReviewPhase, revisionMode: "edits" | "full"): Record<string, unknown>;
@@ -1,6 +1,6 @@
1
1
  import { zodToJsonSchema } from "zod-to-json-schema";
2
2
  import { DirectionFeedbackSchema, RiskFeedbackSchema, ReviewFeedbackSchema, } from "./feedback.js";
3
- import { PlannerRevisionSchema } from "./revision.js";
3
+ import { PlannerRevisionSchema, DirectionRevisionSchema, EditsRevisionSchema, } from "./revision.js";
4
4
  /**
5
5
  * JSON Schemas generated from Zod schemas, used for constrained model output
6
6
  * via `claude --json-schema` and `codex --output-schema`.
@@ -140,6 +140,8 @@ export const DirectionFeedbackJsonSchema = generate(DirectionFeedbackSchema);
140
140
  export const RiskFeedbackJsonSchema = generate(RiskFeedbackSchema);
141
141
  export const ReviewFeedbackJsonSchema = generate(ReviewFeedbackSchema);
142
142
  export const PlannerRevisionJsonSchema = generate(PlannerRevisionSchema);
143
+ const DirectionRevisionJsonSchema = generate(DirectionRevisionSchema);
144
+ const EditsRevisionJsonSchema = generate(EditsRevisionSchema);
143
145
  /**
144
146
  * Get the JSON Schema appropriate for a given review phase.
145
147
  */
@@ -150,4 +152,21 @@ export function getFeedbackJsonSchemaForPhase(phase) {
150
152
  return RiskFeedbackJsonSchema;
151
153
  return ReviewFeedbackJsonSchema;
152
154
  }
155
+ /**
156
+ * Get the JSON Schema for a planner revision response, selecting the
157
+ * shape based on phase and the configured revision mode.
158
+ *
159
+ * - Direction phase always emits `updated_plan` (sweeping rewrites are
160
+ * allowed in round 1).
161
+ * - Risk + detail phase with `revisionMode: "edits"` emits an `edits[]`
162
+ * array — the planner cannot fall back to full output.
163
+ * - Risk + detail phase with `revisionMode: "full"` keeps the full-plan
164
+ * shape (kill switch).
165
+ */
166
+ export function getRevisionJsonSchema(phase, revisionMode) {
167
+ if (phase === "direction" || revisionMode === "full") {
168
+ return DirectionRevisionJsonSchema;
169
+ }
170
+ return EditsRevisionJsonSchema;
171
+ }
153
172
  //# sourceMappingURL=json-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../../src/schemas/json-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../../src/schemas/json-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ import { z } from "zod";
2
+ export declare const InvocationAttemptSchema: z.ZodObject<{
3
+ mode: z.ZodEnum<["structured", "legacy"]>;
4
+ provider: z.ZodString;
5
+ model: z.ZodNullable<z.ZodString>;
6
+ effort: z.ZodNullable<z.ZodString>;
7
+ prompt_chars: z.ZodNumber;
8
+ prompt_lines: z.ZodNumber;
9
+ output_chars: z.ZodNullable<z.ZodNumber>;
10
+ output_lines: z.ZodNullable<z.ZodNumber>;
11
+ duration_ms: z.ZodNumber;
12
+ ok: z.ZodBoolean;
13
+ error_kind: z.ZodNullable<z.ZodEnum<["capability", "fatal", "parse", "zod", "edit-retry"]>>;
14
+ error_exit_code: z.ZodNullable<z.ZodNumber>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ provider: string;
17
+ model: string | null;
18
+ effort: string | null;
19
+ ok: boolean;
20
+ mode: "structured" | "legacy";
21
+ prompt_chars: number;
22
+ prompt_lines: number;
23
+ output_chars: number | null;
24
+ output_lines: number | null;
25
+ duration_ms: number;
26
+ error_kind: "capability" | "fatal" | "parse" | "zod" | "edit-retry" | null;
27
+ error_exit_code: number | null;
28
+ }, {
29
+ provider: string;
30
+ model: string | null;
31
+ effort: string | null;
32
+ ok: boolean;
33
+ mode: "structured" | "legacy";
34
+ prompt_chars: number;
35
+ prompt_lines: number;
36
+ output_chars: number | null;
37
+ output_lines: number | null;
38
+ duration_ms: number;
39
+ error_kind: "capability" | "fatal" | "parse" | "zod" | "edit-retry" | null;
40
+ error_exit_code: number | null;
41
+ }>;
42
+ export declare const RoundMetricsSchema: z.ZodObject<{
43
+ schema_version: z.ZodLiteral<1>;
44
+ session_id: z.ZodString;
45
+ round: z.ZodNumber;
46
+ phase: z.ZodEnum<["direction", "risk", "detail"]>;
47
+ role: z.ZodEnum<["review", "revision"]>;
48
+ started_at: z.ZodString;
49
+ completed_at: z.ZodString;
50
+ total_duration_ms: z.ZodNumber;
51
+ attempts: z.ZodArray<z.ZodObject<{
52
+ mode: z.ZodEnum<["structured", "legacy"]>;
53
+ provider: z.ZodString;
54
+ model: z.ZodNullable<z.ZodString>;
55
+ effort: z.ZodNullable<z.ZodString>;
56
+ prompt_chars: z.ZodNumber;
57
+ prompt_lines: z.ZodNumber;
58
+ output_chars: z.ZodNullable<z.ZodNumber>;
59
+ output_lines: z.ZodNullable<z.ZodNumber>;
60
+ duration_ms: z.ZodNumber;
61
+ ok: z.ZodBoolean;
62
+ error_kind: z.ZodNullable<z.ZodEnum<["capability", "fatal", "parse", "zod", "edit-retry"]>>;
63
+ error_exit_code: z.ZodNullable<z.ZodNumber>;
64
+ }, "strip", z.ZodTypeAny, {
65
+ provider: string;
66
+ model: string | null;
67
+ effort: string | null;
68
+ ok: boolean;
69
+ mode: "structured" | "legacy";
70
+ prompt_chars: number;
71
+ prompt_lines: number;
72
+ output_chars: number | null;
73
+ output_lines: number | null;
74
+ duration_ms: number;
75
+ error_kind: "capability" | "fatal" | "parse" | "zod" | "edit-retry" | null;
76
+ error_exit_code: number | null;
77
+ }, {
78
+ provider: string;
79
+ model: string | null;
80
+ effort: string | null;
81
+ ok: boolean;
82
+ mode: "structured" | "legacy";
83
+ prompt_chars: number;
84
+ prompt_lines: number;
85
+ output_chars: number | null;
86
+ output_lines: number | null;
87
+ duration_ms: number;
88
+ error_kind: "capability" | "fatal" | "parse" | "zod" | "edit-retry" | null;
89
+ error_exit_code: number | null;
90
+ }>, "many">;
91
+ revision_mode: z.ZodOptional<z.ZodNullable<z.ZodEnum<["full", "edits"]>>>;
92
+ edits_attempted: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
93
+ edits_applied: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
94
+ edits_failed: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
95
+ edits_retried: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
96
+ edits_recovered: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
97
+ retry_invoked: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ schema_version: 1;
100
+ session_id: string;
101
+ round: number;
102
+ phase: "direction" | "risk" | "detail";
103
+ role: "review" | "revision";
104
+ started_at: string;
105
+ completed_at: string;
106
+ total_duration_ms: number;
107
+ attempts: {
108
+ provider: string;
109
+ model: string | null;
110
+ effort: string | null;
111
+ ok: boolean;
112
+ mode: "structured" | "legacy";
113
+ prompt_chars: number;
114
+ prompt_lines: number;
115
+ output_chars: number | null;
116
+ output_lines: number | null;
117
+ duration_ms: number;
118
+ error_kind: "capability" | "fatal" | "parse" | "zod" | "edit-retry" | null;
119
+ error_exit_code: number | null;
120
+ }[];
121
+ revision_mode?: "edits" | "full" | null | undefined;
122
+ edits_attempted?: number | null | undefined;
123
+ edits_applied?: number | null | undefined;
124
+ edits_failed?: number | null | undefined;
125
+ edits_retried?: number | null | undefined;
126
+ edits_recovered?: number | null | undefined;
127
+ retry_invoked?: boolean | null | undefined;
128
+ }, {
129
+ schema_version: 1;
130
+ session_id: string;
131
+ round: number;
132
+ phase: "direction" | "risk" | "detail";
133
+ role: "review" | "revision";
134
+ started_at: string;
135
+ completed_at: string;
136
+ total_duration_ms: number;
137
+ attempts: {
138
+ provider: string;
139
+ model: string | null;
140
+ effort: string | null;
141
+ ok: boolean;
142
+ mode: "structured" | "legacy";
143
+ prompt_chars: number;
144
+ prompt_lines: number;
145
+ output_chars: number | null;
146
+ output_lines: number | null;
147
+ duration_ms: number;
148
+ error_kind: "capability" | "fatal" | "parse" | "zod" | "edit-retry" | null;
149
+ error_exit_code: number | null;
150
+ }[];
151
+ revision_mode?: "edits" | "full" | null | undefined;
152
+ edits_attempted?: number | null | undefined;
153
+ edits_applied?: number | null | undefined;
154
+ edits_failed?: number | null | undefined;
155
+ edits_retried?: number | null | undefined;
156
+ edits_recovered?: number | null | undefined;
157
+ retry_invoked?: boolean | null | undefined;
158
+ }>;
159
+ export type InvocationAttempt = z.infer<typeof InvocationAttemptSchema>;
160
+ export type RoundMetrics = z.infer<typeof RoundMetricsSchema>;
161
+ export interface MetricsContext {
162
+ sessionId: string;
163
+ round: number;
164
+ phase: "direction" | "risk" | "detail";
165
+ role: "review" | "revision";
166
+ }
167
+ export interface TimingSummary {
168
+ duration_ms: number;
169
+ attempts: number;
170
+ }
171
+ export declare function summarizeTiming(metrics: RoundMetrics): TimingSummary;
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ export const InvocationAttemptSchema = z.object({
3
+ mode: z.enum(["structured", "legacy"]),
4
+ provider: z.string(),
5
+ model: z.string().nullable(),
6
+ effort: z.string().nullable(),
7
+ prompt_chars: z.number().int().nonnegative(),
8
+ prompt_lines: z.number().int().nonnegative(),
9
+ output_chars: z.number().int().nonnegative().nullable(),
10
+ output_lines: z.number().int().nonnegative().nullable(),
11
+ duration_ms: z.number().int().nonnegative(),
12
+ ok: z.boolean(),
13
+ // `edit-retry` marks the targeted retry pass for failed edits in
14
+ // edits-mode revisions. It is not a state-machine downgrade — the
15
+ // structured/legacy mode is captured in `mode` independently.
16
+ error_kind: z
17
+ .enum(["capability", "fatal", "parse", "zod", "edit-retry"])
18
+ .nullable(),
19
+ error_exit_code: z.number().int().nullable(),
20
+ });
21
+ // Edits-mode revision telemetry. Null fields in full-mode revisions and in
22
+ // review rounds. `revision_mode` is the discriminator — when `"full"`, all
23
+ // `edits_*` and `retry_invoked` fields are null; when `"edits"`, they
24
+ // describe the round's edit-application pass.
25
+ export const RoundMetricsSchema = z.object({
26
+ schema_version: z.literal(1),
27
+ session_id: z.string(),
28
+ round: z.number().int().positive(),
29
+ phase: z.enum(["direction", "risk", "detail"]),
30
+ role: z.enum(["review", "revision"]),
31
+ started_at: z.string(),
32
+ completed_at: z.string(),
33
+ total_duration_ms: z.number().int().nonnegative(),
34
+ attempts: z.array(InvocationAttemptSchema),
35
+ revision_mode: z.enum(["full", "edits"]).nullable().optional(),
36
+ edits_attempted: z.number().int().nonnegative().nullable().optional(),
37
+ edits_applied: z.number().int().nonnegative().nullable().optional(),
38
+ edits_failed: z.number().int().nonnegative().nullable().optional(),
39
+ edits_retried: z.number().int().nonnegative().nullable().optional(),
40
+ edits_recovered: z.number().int().nonnegative().nullable().optional(),
41
+ retry_invoked: z.boolean().nullable().optional(),
42
+ });
43
+ export function summarizeTiming(metrics) {
44
+ return {
45
+ duration_ms: metrics.total_duration_ms,
46
+ attempts: metrics.attempts.length,
47
+ };
48
+ }
49
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/schemas/metrics.ts"],"names":[],"mappings":"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"}
@@ -48,6 +48,165 @@ export declare const IssueResponseSchema: z.ZodObject<{
48
48
  justification: string;
49
49
  } | undefined;
50
50
  }>;
51
+ export declare const ReplaceEditSchema: z.ZodObject<{
52
+ section: z.ZodString;
53
+ before: z.ZodString;
54
+ after: z.ZodString;
55
+ }, "strip", z.ZodTypeAny, {
56
+ section: string;
57
+ before: string;
58
+ after: string;
59
+ }, {
60
+ section: string;
61
+ before: string;
62
+ after: string;
63
+ }>;
64
+ export declare const DirectionRevisionSchema: z.ZodObject<{
65
+ responses: z.ZodArray<z.ZodObject<{
66
+ issue_id: z.ZodString;
67
+ action: z.ZodEnum<["accepted", "rejected", "deferred"]>;
68
+ severity_dispute: z.ZodOptional<z.ZodObject<{
69
+ original: z.ZodEnum<["P1", "P2", "P3"]>;
70
+ revised: z.ZodEnum<["P1", "P2", "P3"]>;
71
+ justification: z.ZodString;
72
+ }, "strip", z.ZodTypeAny, {
73
+ original: "P1" | "P2" | "P3";
74
+ revised: "P1" | "P2" | "P3";
75
+ justification: string;
76
+ }, {
77
+ original: "P1" | "P2" | "P3";
78
+ revised: "P1" | "P2" | "P3";
79
+ justification: string;
80
+ }>>;
81
+ rationale: z.ZodString;
82
+ }, "strip", z.ZodTypeAny, {
83
+ issue_id: string;
84
+ action: "accepted" | "rejected" | "deferred";
85
+ rationale: string;
86
+ severity_dispute?: {
87
+ original: "P1" | "P2" | "P3";
88
+ revised: "P1" | "P2" | "P3";
89
+ justification: string;
90
+ } | undefined;
91
+ }, {
92
+ issue_id: string;
93
+ action: "accepted" | "rejected" | "deferred";
94
+ rationale: string;
95
+ severity_dispute?: {
96
+ original: "P1" | "P2" | "P3";
97
+ revised: "P1" | "P2" | "P3";
98
+ justification: string;
99
+ } | undefined;
100
+ }>, "many">;
101
+ updated_plan: z.ZodString;
102
+ }, "strict", z.ZodTypeAny, {
103
+ responses: {
104
+ issue_id: string;
105
+ action: "accepted" | "rejected" | "deferred";
106
+ rationale: string;
107
+ severity_dispute?: {
108
+ original: "P1" | "P2" | "P3";
109
+ revised: "P1" | "P2" | "P3";
110
+ justification: string;
111
+ } | undefined;
112
+ }[];
113
+ updated_plan: string;
114
+ }, {
115
+ responses: {
116
+ issue_id: string;
117
+ action: "accepted" | "rejected" | "deferred";
118
+ rationale: string;
119
+ severity_dispute?: {
120
+ original: "P1" | "P2" | "P3";
121
+ revised: "P1" | "P2" | "P3";
122
+ justification: string;
123
+ } | undefined;
124
+ }[];
125
+ updated_plan: string;
126
+ }>;
127
+ export declare const EditsRevisionSchema: z.ZodObject<{
128
+ responses: z.ZodArray<z.ZodObject<{
129
+ issue_id: z.ZodString;
130
+ action: z.ZodEnum<["accepted", "rejected", "deferred"]>;
131
+ severity_dispute: z.ZodOptional<z.ZodObject<{
132
+ original: z.ZodEnum<["P1", "P2", "P3"]>;
133
+ revised: z.ZodEnum<["P1", "P2", "P3"]>;
134
+ justification: z.ZodString;
135
+ }, "strip", z.ZodTypeAny, {
136
+ original: "P1" | "P2" | "P3";
137
+ revised: "P1" | "P2" | "P3";
138
+ justification: string;
139
+ }, {
140
+ original: "P1" | "P2" | "P3";
141
+ revised: "P1" | "P2" | "P3";
142
+ justification: string;
143
+ }>>;
144
+ rationale: z.ZodString;
145
+ }, "strip", z.ZodTypeAny, {
146
+ issue_id: string;
147
+ action: "accepted" | "rejected" | "deferred";
148
+ rationale: string;
149
+ severity_dispute?: {
150
+ original: "P1" | "P2" | "P3";
151
+ revised: "P1" | "P2" | "P3";
152
+ justification: string;
153
+ } | undefined;
154
+ }, {
155
+ issue_id: string;
156
+ action: "accepted" | "rejected" | "deferred";
157
+ rationale: string;
158
+ severity_dispute?: {
159
+ original: "P1" | "P2" | "P3";
160
+ revised: "P1" | "P2" | "P3";
161
+ justification: string;
162
+ } | undefined;
163
+ }>, "many">;
164
+ edits: z.ZodArray<z.ZodObject<{
165
+ section: z.ZodString;
166
+ before: z.ZodString;
167
+ after: z.ZodString;
168
+ }, "strip", z.ZodTypeAny, {
169
+ section: string;
170
+ before: string;
171
+ after: string;
172
+ }, {
173
+ section: string;
174
+ before: string;
175
+ after: string;
176
+ }>, "many">;
177
+ }, "strict", z.ZodTypeAny, {
178
+ responses: {
179
+ issue_id: string;
180
+ action: "accepted" | "rejected" | "deferred";
181
+ rationale: string;
182
+ severity_dispute?: {
183
+ original: "P1" | "P2" | "P3";
184
+ revised: "P1" | "P2" | "P3";
185
+ justification: string;
186
+ } | undefined;
187
+ }[];
188
+ edits: {
189
+ section: string;
190
+ before: string;
191
+ after: string;
192
+ }[];
193
+ }, {
194
+ responses: {
195
+ issue_id: string;
196
+ action: "accepted" | "rejected" | "deferred";
197
+ rationale: string;
198
+ severity_dispute?: {
199
+ original: "P1" | "P2" | "P3";
200
+ revised: "P1" | "P2" | "P3";
201
+ justification: string;
202
+ } | undefined;
203
+ }[];
204
+ edits: {
205
+ section: string;
206
+ before: string;
207
+ after: string;
208
+ }[];
209
+ }>;
51
210
  export declare const PlannerRevisionSchema: z.ZodObject<{
52
211
  responses: z.ZodArray<z.ZodObject<{
53
212
  issue_id: z.ZodString;
@@ -86,7 +245,7 @@ export declare const PlannerRevisionSchema: z.ZodObject<{
86
245
  } | undefined;
87
246
  }>, "many">;
88
247
  updated_plan: z.ZodString;
89
- }, "strip", z.ZodTypeAny, {
248
+ }, "strict", z.ZodTypeAny, {
90
249
  responses: {
91
250
  issue_id: string;
92
251
  action: "accepted" | "rejected" | "deferred";
@@ -113,4 +272,9 @@ export declare const PlannerRevisionSchema: z.ZodObject<{
113
272
  }>;
114
273
  export type SeverityDispute = z.infer<typeof SeverityDisputeSchema>;
115
274
  export type IssueResponse = z.infer<typeof IssueResponseSchema>;
116
- export type PlannerRevision = z.infer<typeof PlannerRevisionSchema>;
275
+ export type ReplaceEdit = z.infer<typeof ReplaceEditSchema>;
276
+ export type DirectionRevision = z.infer<typeof DirectionRevisionSchema>;
277
+ export type EditsRevision = z.infer<typeof EditsRevisionSchema>;
278
+ export type PlannerRevision = DirectionRevision | EditsRevision;
279
+ export declare function isEditsRevision(r: PlannerRevision): r is EditsRevision;
280
+ export declare function isDirectionRevision(r: PlannerRevision): r is DirectionRevision;
@@ -10,8 +10,41 @@ export const IssueResponseSchema = z.object({
10
10
  severity_dispute: SeverityDisputeSchema.optional(),
11
11
  rationale: z.string(),
12
12
  });
13
- export const PlannerRevisionSchema = z.object({
13
+ // `before.length <= 2000` and `after.length <= 5000` are hard caps that prevent
14
+ // the planner from "editing" the entire plan in one edit, which defeats the
15
+ // point. Section scoping makes the unique-match constraint mean "unique within
16
+ // section" rather than "unique within plan".
17
+ export const ReplaceEditSchema = z.object({
18
+ section: z.string().min(1),
19
+ before: z.string().min(1).max(2000),
20
+ after: z.string().max(5000),
21
+ });
22
+ // Direction-phase revisions are intentionally allowed to be sweeping rewrites,
23
+ // so they keep the full-plan output shape.
24
+ export const DirectionRevisionSchema = z
25
+ .object({
14
26
  responses: z.array(IssueResponseSchema),
15
27
  updated_plan: z.string(),
16
- });
28
+ })
29
+ .strict();
30
+ // Risk + detail-phase revisions emit a structured edit list instead. The
31
+ // applier replays edits server-side. No `updated_plan` field — `.strict()`
32
+ // rejects payloads that try to provide one.
33
+ export const EditsRevisionSchema = z
34
+ .object({
35
+ responses: z.array(IssueResponseSchema),
36
+ edits: z.array(ReplaceEditSchema),
37
+ })
38
+ .strict();
39
+ // Backward-compatible export — equals DirectionRevisionSchema.
40
+ // Kept so existing imports of `PlannerRevisionSchema` (e.g., legacy
41
+ // JSON-Schema generation) continue to compile while the codebase migrates
42
+ // to phase-aware schemas.
43
+ export const PlannerRevisionSchema = DirectionRevisionSchema;
44
+ export function isEditsRevision(r) {
45
+ return "edits" in r;
46
+ }
47
+ export function isDirectionRevision(r) {
48
+ return "updated_plan" in r;
49
+ }
17
50
  //# sourceMappingURL=revision.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"revision.js","sourceRoot":"","sources":["../../../src/schemas/revision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACpD,gBAAgB,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC"}
1
+ {"version":3,"file":"revision.js","sourceRoot":"","sources":["../../../src/schemas/revision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACpD,gBAAgB,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,gFAAgF;AAChF,4EAA4E;AAC5E,+EAA+E;AAC/E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;CAC5B,CAAC,CAAC;AAEH,+EAA+E;AAC/E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,yEAAyE;AACzE,2EAA2E;AAC3E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;CAClC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,+DAA+D;AAC/D,oEAAoE;AACpE,0EAA0E;AAC1E,0BAA0B;AAC1B,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAS7D,MAAM,UAAU,eAAe,CAAC,CAAkB;IAChD,OAAO,OAAO,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAkB;IACpD,OAAO,cAAc,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -35,6 +35,8 @@ export declare const SessionSchema: z.ZodObject<{
35
35
  startedAt: z.ZodString;
36
36
  planHash: z.ZodString;
37
37
  initialLineCount: z.ZodOptional<z.ZodNumber>;
38
+ reviewerSessionId: z.ZodOptional<z.ZodString>;
39
+ reviewerSessionInitialized: z.ZodOptional<z.ZodBoolean>;
38
40
  }, "strip", z.ZodTypeAny, {
39
41
  id: string;
40
42
  status: "aborted" | "approved" | "blocked" | "planning" | "in_review";
@@ -55,6 +57,8 @@ export declare const SessionSchema: z.ZodObject<{
55
57
  startedAt: string;
56
58
  planHash: string;
57
59
  initialLineCount?: number | undefined;
60
+ reviewerSessionId?: string | undefined;
61
+ reviewerSessionInitialized?: boolean | undefined;
58
62
  }, {
59
63
  id: string;
60
64
  status: "aborted" | "approved" | "blocked" | "planning" | "in_review";
@@ -75,5 +79,7 @@ export declare const SessionSchema: z.ZodObject<{
75
79
  startedAt: string;
76
80
  planHash: string;
77
81
  initialLineCount?: number | undefined;
82
+ reviewerSessionId?: string | undefined;
83
+ reviewerSessionInitialized?: boolean | undefined;
78
84
  }>;
79
85
  export type Session = z.infer<typeof SessionSchema>;
@@ -12,5 +12,15 @@ export const SessionSchema = z.object({
12
12
  startedAt: z.string(),
13
13
  planHash: z.string(),
14
14
  initialLineCount: z.number().int().optional(),
15
+ // Persistent reviewer CLI conversation. Lets the reviewer retain
16
+ // context (plan, its own prior critique) across rounds — round 2+
17
+ // prompts can be a tiny "what changed" diff instead of re-loading the
18
+ // full plan. Initial value: a UUID we generate (used directly by
19
+ // claude reviewer); for codex reviewer it's overwritten with the
20
+ // thread_id captured from the first invocation's --json stream.
21
+ // `Initialized` flips after the first successful invocation; subsequent
22
+ // calls use `--resume` (claude) or `codex exec resume <id>` (codex).
23
+ reviewerSessionId: z.string().optional(),
24
+ reviewerSessionInitialized: z.boolean().optional(),
15
25
  });
16
26
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/schemas/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,OAAO,EAAE,oBAAoB;IAC7B,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/schemas/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,OAAO,EAAE,oBAAoB;IAC7B,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC7C,iEAAiE;IACjE,kEAAkE;IAClE,sEAAsE;IACtE,iEAAiE;IACjE,iEAAiE;IACjE,gEAAgE;IAChE,wEAAwE;IACxE,qEAAqE;IACrE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,0BAA0B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "planpong",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Multi-model adversarial plan review — orchestrates AI agents to critique and refine implementation plans",
5
5
  "type": "module",
6
6
  "bin": {