planpong 0.4.2 → 0.5.1

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 (57) hide show
  1. package/dist/bin/planpong.js +37 -1
  2. package/dist/bin/planpong.js.map +1 -1
  3. package/dist/src/config/defaults.js +1 -0
  4. package/dist/src/config/defaults.js.map +1 -1
  5. package/dist/src/config/loader.d.ts +1 -0
  6. package/dist/src/config/loader.js +3 -0
  7. package/dist/src/config/loader.js.map +1 -1
  8. package/dist/src/core/apply-edits.d.ts +40 -0
  9. package/dist/src/core/apply-edits.js +220 -0
  10. package/dist/src/core/apply-edits.js.map +1 -0
  11. package/dist/src/core/convergence.d.ts +18 -2
  12. package/dist/src/core/convergence.js +21 -9
  13. package/dist/src/core/convergence.js.map +1 -1
  14. package/dist/src/core/operations.d.ts +14 -1
  15. package/dist/src/core/operations.js +551 -62
  16. package/dist/src/core/operations.js.map +1 -1
  17. package/dist/src/core/plan-diff.d.ts +23 -0
  18. package/dist/src/core/plan-diff.js +135 -0
  19. package/dist/src/core/plan-diff.js.map +1 -0
  20. package/dist/src/core/session.d.ts +11 -0
  21. package/dist/src/core/session.js +51 -1
  22. package/dist/src/core/session.js.map +1 -1
  23. package/dist/src/mcp/tools/get-feedback.d.ts +16 -0
  24. package/dist/src/mcp/tools/get-feedback.js +118 -114
  25. package/dist/src/mcp/tools/get-feedback.js.map +1 -1
  26. package/dist/src/mcp/tools/revise.d.ts +16 -0
  27. package/dist/src/mcp/tools/revise.js +76 -61
  28. package/dist/src/mcp/tools/revise.js.map +1 -1
  29. package/dist/src/mcp/tools/status.js +15 -1
  30. package/dist/src/mcp/tools/status.js.map +1 -1
  31. package/dist/src/prompts/planner.d.ts +34 -1
  32. package/dist/src/prompts/planner.js +239 -4
  33. package/dist/src/prompts/planner.js.map +1 -1
  34. package/dist/src/prompts/reviewer.d.ts +13 -0
  35. package/dist/src/prompts/reviewer.js +65 -0
  36. package/dist/src/prompts/reviewer.js.map +1 -1
  37. package/dist/src/providers/claude.js +19 -3
  38. package/dist/src/providers/claude.js.map +1 -1
  39. package/dist/src/providers/codex.js +50 -3
  40. package/dist/src/providers/codex.js.map +1 -1
  41. package/dist/src/providers/types.d.ts +20 -0
  42. package/dist/src/schemas/config.d.ts +3 -0
  43. package/dist/src/schemas/config.js +6 -0
  44. package/dist/src/schemas/config.js.map +1 -1
  45. package/dist/src/schemas/json-schema.d.ts +12 -0
  46. package/dist/src/schemas/json-schema.js +20 -1
  47. package/dist/src/schemas/json-schema.js.map +1 -1
  48. package/dist/src/schemas/metrics.d.ts +171 -0
  49. package/dist/src/schemas/metrics.js +49 -0
  50. package/dist/src/schemas/metrics.js.map +1 -0
  51. package/dist/src/schemas/revision.d.ts +166 -2
  52. package/dist/src/schemas/revision.js +35 -2
  53. package/dist/src/schemas/revision.js.map +1 -1
  54. package/dist/src/schemas/session.d.ts +6 -0
  55. package/dist/src/schemas/session.js +10 -0
  56. package/dist/src/schemas/session.js.map +1 -1
  57. package/package.json +1 -1
@@ -13,130 +13,134 @@ const inputSchema = {
13
13
  .optional()
14
14
  .describe("Working directory (defaults to process.cwd())"),
15
15
  };
16
- export function registerGetFeedback(server) {
17
- server.tool("planpong_get_feedback", "Send the current plan to the reviewer model for critique. Returns structured feedback with issues, severity counts, and convergence status.", inputSchema, async (input) => {
18
- const cwd = input.cwd ?? process.cwd();
19
- const session = readSessionState(cwd, input.session_id);
20
- if (!session) {
21
- return {
22
- content: [
23
- {
24
- type: "text",
25
- text: JSON.stringify({
26
- error: `Session not found: ${input.session_id}`,
27
- }),
28
- },
29
- ],
30
- isError: true,
31
- };
32
- }
33
- if (session.status !== "in_review") {
34
- return {
35
- content: [
36
- {
37
- type: "text",
38
- text: JSON.stringify({
39
- error: `Session status is '${session.status}', expected 'in_review'`,
40
- }),
41
- },
42
- ],
43
- isError: true,
44
- };
45
- }
46
- // Advance round
47
- session.currentRound++;
48
- writeSessionState(cwd, session);
49
- const config = loadConfig({ cwd });
50
- // Use session-stored provider config
51
- const reviewerProvider = getProvider(session.reviewer.provider);
52
- if (!reviewerProvider) {
53
- return {
54
- content: [
55
- {
56
- type: "text",
57
- text: JSON.stringify({
58
- error: `Reviewer provider not found: ${session.reviewer.provider}`,
59
- }),
60
- },
61
- ],
62
- isError: true,
63
- };
64
- }
65
- // Build config with session overrides
66
- const sessionConfig = {
67
- ...config,
68
- reviewer: session.reviewer,
69
- planner: session.planner,
70
- };
71
- const result = await runReviewRound(session, cwd, sessionConfig, reviewerProvider);
72
- // Update status line with review results
73
- const suffix = result.converged
74
- ? result.feedback.verdict === "blocked"
75
- ? `BLOCKED in ${getReviewPhase(result.round)} phase`
76
- : `Approved after ${result.round} rounds`
77
- : `Reviewed — ${result.feedback.issues.length} issues`;
78
- const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, suffix);
79
- const phase = getReviewPhase(result.round);
80
- const response = {
81
- round: result.round,
82
- phase,
83
- verdict: result.feedback.verdict,
84
- summary: result.feedback.summary,
85
- issues: result.feedback.issues,
86
- severity_counts: result.severity,
87
- is_converged: result.converged,
88
- status_line: statusLine,
16
+ export async function getFeedbackHandler(input) {
17
+ const cwd = input.cwd ?? process.cwd();
18
+ const session = readSessionState(cwd, input.session_id);
19
+ if (!session) {
20
+ return {
21
+ content: [
22
+ {
23
+ type: "text",
24
+ text: JSON.stringify({
25
+ error: `Session not found: ${input.session_id}`,
26
+ }),
27
+ },
28
+ ],
29
+ isError: true,
89
30
  };
90
- // Phase-specific lean fields for status line consumption
91
- if (result.phaseExtras.is_blocked) {
92
- response.is_blocked = true;
93
- }
94
- if (phase === "direction" && result.phaseExtras.confidence) {
95
- response.confidence = result.phaseExtras.confidence;
96
- }
97
- if (phase === "risk") {
98
- if (result.phaseExtras.risk_level) {
99
- response.risk_level = result.phaseExtras.risk_level;
100
- }
101
- if (result.phaseExtras.risk_count !== undefined) {
102
- response.risk_count = result.phaseExtras.risk_count;
103
- }
104
- if (result.phaseExtras.risks_promoted !== undefined) {
105
- response.risks_promoted = result.phaseExtras.risks_promoted;
106
- }
107
- }
108
- if (result.converged) {
109
- if (result.feedback.verdict === "blocked") {
110
- session.status = "blocked";
111
- }
112
- else {
113
- session.status = "approved";
114
- const planPath = resolve(cwd, session.planPath);
115
- let planContent = readFileSync(planPath, "utf-8");
116
- planContent = planContent.replace(/\*\*Status:\*\* .*/, "**Status:** Approved");
117
- writeFileSync(planPath, planContent);
118
- }
119
- writeSessionState(cwd, session);
120
- // Include initial plan for change summary
121
- const initialPlan = readInitialPlan(cwd, session.id);
122
- if (initialPlan) {
123
- response.initial_plan = initialPlan;
124
- const planPath = resolve(cwd, session.planPath);
125
- response.final_plan = readFileSync(planPath, "utf-8");
126
- }
127
- }
31
+ }
32
+ if (session.status !== "in_review") {
128
33
  return {
129
34
  content: [
130
35
  {
131
36
  type: "text",
132
- text: statusLine,
37
+ text: JSON.stringify({
38
+ error: `Session status is '${session.status}', expected 'in_review'`,
39
+ }),
133
40
  },
41
+ ],
42
+ isError: true,
43
+ };
44
+ }
45
+ // Advance round
46
+ session.currentRound++;
47
+ writeSessionState(cwd, session);
48
+ const config = loadConfig({ cwd });
49
+ // Use session-stored provider config
50
+ const reviewerProvider = getProvider(session.reviewer.provider);
51
+ if (!reviewerProvider) {
52
+ return {
53
+ content: [
134
54
  {
135
55
  type: "text",
136
- text: JSON.stringify(response),
56
+ text: JSON.stringify({
57
+ error: `Reviewer provider not found: ${session.reviewer.provider}`,
58
+ }),
137
59
  },
138
60
  ],
61
+ isError: true,
139
62
  };
140
- });
63
+ }
64
+ // Build config with session overrides
65
+ const sessionConfig = {
66
+ ...config,
67
+ reviewer: session.reviewer,
68
+ planner: session.planner,
69
+ };
70
+ const result = await runReviewRound(session, cwd, sessionConfig, reviewerProvider);
71
+ // Update status line with review results
72
+ const suffix = result.converged
73
+ ? result.feedback.verdict === "blocked"
74
+ ? `BLOCKED in ${getReviewPhase(result.round)} phase`
75
+ : `Approved after ${result.round} rounds`
76
+ : `Reviewed — ${result.feedback.issues.length} issues`;
77
+ const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, suffix);
78
+ const phase = getReviewPhase(result.round);
79
+ const response = {
80
+ round: result.round,
81
+ phase,
82
+ verdict: result.feedback.verdict,
83
+ summary: result.feedback.summary,
84
+ issues: result.feedback.issues,
85
+ severity_counts: result.severity,
86
+ is_converged: result.converged,
87
+ status_line: statusLine,
88
+ };
89
+ if (result.timing) {
90
+ response.timing = result.timing;
91
+ }
92
+ // Phase-specific lean fields for status line consumption
93
+ if (result.phaseExtras.is_blocked) {
94
+ response.is_blocked = true;
95
+ }
96
+ if (phase === "direction" && result.phaseExtras.confidence) {
97
+ response.confidence = result.phaseExtras.confidence;
98
+ }
99
+ if (phase === "risk") {
100
+ if (result.phaseExtras.risk_level) {
101
+ response.risk_level = result.phaseExtras.risk_level;
102
+ }
103
+ if (result.phaseExtras.risk_count !== undefined) {
104
+ response.risk_count = result.phaseExtras.risk_count;
105
+ }
106
+ if (result.phaseExtras.risks_promoted !== undefined) {
107
+ response.risks_promoted = result.phaseExtras.risks_promoted;
108
+ }
109
+ }
110
+ if (result.converged) {
111
+ if (result.feedback.verdict === "blocked") {
112
+ session.status = "blocked";
113
+ }
114
+ else {
115
+ session.status = "approved";
116
+ const planPath = resolve(cwd, session.planPath);
117
+ let planContent = readFileSync(planPath, "utf-8");
118
+ planContent = planContent.replace(/\*\*Status:\*\* .*/, "**Status:** Approved");
119
+ writeFileSync(planPath, planContent);
120
+ }
121
+ writeSessionState(cwd, session);
122
+ // Include initial plan for change summary
123
+ const initialPlan = readInitialPlan(cwd, session.id);
124
+ if (initialPlan) {
125
+ response.initial_plan = initialPlan;
126
+ const planPath = resolve(cwd, session.planPath);
127
+ response.final_plan = readFileSync(planPath, "utf-8");
128
+ }
129
+ }
130
+ return {
131
+ content: [
132
+ {
133
+ type: "text",
134
+ text: statusLine,
135
+ },
136
+ {
137
+ type: "text",
138
+ text: JSON.stringify(response),
139
+ },
140
+ ],
141
+ };
142
+ }
143
+ export function registerGetFeedback(server) {
144
+ server.tool("planpong_get_feedback", "Send the current plan to the reviewer model for critique. Returns structured feedback with issues, severity counts, and convergence status.", inputSchema, getFeedbackHandler);
141
145
  }
142
146
  //# sourceMappingURL=get-feedback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-feedback.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-feedback.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,18 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function reviseHandler(input: {
3
+ session_id: string;
4
+ cwd?: string;
5
+ }): Promise<{
6
+ content: {
7
+ type: "text";
8
+ text: string;
9
+ }[];
10
+ isError: boolean;
11
+ } | {
12
+ content: {
13
+ type: "text";
14
+ text: string;
15
+ }[];
16
+ isError?: undefined;
17
+ }>;
2
18
  export declare function registerRevise(server: McpServer): void;
@@ -10,79 +10,94 @@ const inputSchema = {
10
10
  .optional()
11
11
  .describe("Working directory (defaults to process.cwd())"),
12
12
  };
13
- export function registerRevise(server) {
14
- server.tool("planpong_revise", "Send plan + latest feedback to the planner model for revision. Writes the updated plan to disk. Call after planpong_get_feedback returns is_converged: false.", inputSchema, async (input) => {
15
- const cwd = input.cwd ?? process.cwd();
16
- const session = readSessionState(cwd, input.session_id);
17
- if (!session) {
18
- return {
19
- content: [
20
- {
21
- type: "text",
22
- text: JSON.stringify({
23
- error: `Session not found: ${input.session_id}`,
24
- }),
25
- },
26
- ],
27
- isError: true,
28
- };
29
- }
30
- if (session.status !== "in_review") {
31
- return {
32
- content: [
33
- {
34
- type: "text",
35
- text: JSON.stringify({
36
- error: `Session status is '${session.status}', expected 'in_review'`,
37
- }),
38
- },
39
- ],
40
- isError: true,
41
- };
42
- }
43
- const config = loadConfig({ cwd });
44
- const plannerProvider = getProvider(session.planner.provider);
45
- if (!plannerProvider) {
46
- return {
47
- content: [
48
- {
49
- type: "text",
50
- text: JSON.stringify({
51
- error: `Planner provider not found: ${session.planner.provider}`,
52
- }),
53
- },
54
- ],
55
- isError: true,
56
- };
57
- }
58
- const sessionConfig = {
59
- ...config,
60
- planner: session.planner,
61
- reviewer: session.reviewer,
13
+ export async function reviseHandler(input) {
14
+ const cwd = input.cwd ?? process.cwd();
15
+ const session = readSessionState(cwd, input.session_id);
16
+ if (!session) {
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: JSON.stringify({
22
+ error: `Session not found: ${input.session_id}`,
23
+ }),
24
+ },
25
+ ],
26
+ isError: true,
62
27
  };
63
- const result = await runRevisionRound(session, cwd, sessionConfig, plannerProvider);
64
- // Update status line in plan file (planner may have mangled it)
65
- const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Revision submitted");
28
+ }
29
+ if (session.status !== "in_review") {
66
30
  return {
67
31
  content: [
68
32
  {
69
33
  type: "text",
70
- text: statusLine,
34
+ text: JSON.stringify({
35
+ error: `Session status is '${session.status}', expected 'in_review'`,
36
+ }),
71
37
  },
38
+ ],
39
+ isError: true,
40
+ };
41
+ }
42
+ const config = loadConfig({ cwd });
43
+ const plannerProvider = getProvider(session.planner.provider);
44
+ if (!plannerProvider) {
45
+ return {
46
+ content: [
72
47
  {
73
48
  type: "text",
74
49
  text: JSON.stringify({
75
- round: result.round,
76
- responses: result.revision.responses,
77
- accepted: result.accepted,
78
- rejected: result.rejected,
79
- deferred: result.deferred,
80
- plan_updated: result.planUpdated,
81
- status_line: statusLine,
50
+ error: `Planner provider not found: ${session.planner.provider}`,
82
51
  }),
83
52
  },
84
53
  ],
54
+ isError: true,
85
55
  };
86
- });
56
+ }
57
+ const sessionConfig = {
58
+ ...config,
59
+ planner: session.planner,
60
+ reviewer: session.reviewer,
61
+ };
62
+ const result = await runRevisionRound(session, cwd, sessionConfig, plannerProvider);
63
+ // Update status line in plan file (planner may have mangled it)
64
+ const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Revision submitted");
65
+ const payload = {
66
+ round: result.round,
67
+ responses: result.revision.responses,
68
+ accepted: result.accepted,
69
+ rejected: result.rejected,
70
+ deferred: result.deferred,
71
+ plan_updated: result.planUpdated,
72
+ status_line: statusLine,
73
+ };
74
+ if (result.timing) {
75
+ payload.timing = result.timing;
76
+ }
77
+ if (result.edits) {
78
+ payload.revision_mode = result.edits.revision_mode;
79
+ if (result.edits.revision_mode === "edits") {
80
+ payload.edits_attempted = result.edits.edits_attempted;
81
+ payload.edits_applied = result.edits.edits_applied;
82
+ payload.edits_failed = result.edits.edits_failed;
83
+ payload.edits_recovered = result.edits.edits_recovered;
84
+ payload.retry_invoked = result.edits.retry_invoked;
85
+ }
86
+ }
87
+ return {
88
+ content: [
89
+ {
90
+ type: "text",
91
+ text: statusLine,
92
+ },
93
+ {
94
+ type: "text",
95
+ text: JSON.stringify(payload),
96
+ },
97
+ ],
98
+ };
99
+ }
100
+ export function registerRevise(server) {
101
+ server.tool("planpong_revise", "Send plan + latest feedback to the planner model for revision. Writes the updated plan to disk. Call after planpong_get_feedback returns is_converged: false.", inputSchema, reviseHandler);
87
102
  }
88
103
  //# sourceMappingURL=revise.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../../src/mcp/tools/revise.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../../src/mcp/tools/revise.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { readSessionState, readRoundFeedback, readRoundResponse, } from "../../core/session.js";
2
+ import { readSessionState, readRoundFeedback, readRoundResponse, readRoundMetrics, } from "../../core/session.js";
3
3
  import { formatTrajectory, severityFromFeedback, } from "../../core/operations.js";
4
4
  const inputSchema = {
5
5
  session_id: z.string().describe("Session ID to check"),
@@ -53,6 +53,20 @@ export function registerStatus(server) {
53
53
  roundInfo.rejected = rejected;
54
54
  roundInfo.deferred = deferred;
55
55
  }
56
+ const revMetrics = readRoundMetrics(cwd, session.id, r, "revision");
57
+ if (revMetrics?.revision_mode) {
58
+ roundInfo.revision_mode = revMetrics.revision_mode;
59
+ if (revMetrics.revision_mode === "edits") {
60
+ if (revMetrics.edits_applied != null)
61
+ roundInfo.edits_applied = revMetrics.edits_applied;
62
+ if (revMetrics.edits_failed != null)
63
+ roundInfo.edits_failed = revMetrics.edits_failed;
64
+ if (revMetrics.edits_recovered != null)
65
+ roundInfo.edits_recovered = revMetrics.edits_recovered;
66
+ if (revMetrics.retry_invoked != null)
67
+ roundInfo.retry_invoked = revMetrics.retry_invoked;
68
+ }
69
+ }
56
70
  rounds.push(roundInfo);
57
71
  }
58
72
  const trajectory = severities.length > 0
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,37 @@
1
1
  import type { ReviewFeedback } from "../schemas/feedback.js";
2
2
  import type { ReviewPhase } from "./reviewer.js";
3
3
  export declare function buildInitialPlanPrompt(requirements: string, plansDir: string): string;
4
- export declare function buildRevisionPrompt(currentPlan: string, feedback: ReviewFeedback, keyDecisions: string | null, priorContext: string | null, phase?: ReviewPhase, structuredOutput?: boolean): string;
4
+ export declare function buildRevisionPrompt(currentPlan: string, feedback: ReviewFeedback, keyDecisions: string | null, priorContext: string | null, phase?: ReviewPhase, structuredOutput?: boolean, revisionMode?: "edits" | "full"): string;
5
+ /**
6
+ * Build a minimal revision prompt for resumed planner sessions.
7
+ *
8
+ * The planner is already in a persistent CLI conversation that has the
9
+ * plan, the prior reviewer feedback, and the planner's own prior rationales
10
+ * in context. We do NOT re-send "Current Plan", "Prior Decisions", or
11
+ * "Key Decisions" — the model has all of that. Only the new feedback +
12
+ * minimal phase reminder + output schema instructions.
13
+ *
14
+ * The output schema and surgical constraints stay because they're per-call
15
+ * directives, not stable context. (We don't trust that the model won't
16
+ * drift in format across many turns of a long session.)
17
+ */
18
+ export declare function buildIncrementalRevisionPrompt(feedback: ReviewFeedback, phase: ReviewPhase, structuredOutput: boolean, revisionMode?: "edits" | "full"): string;
19
+ /**
20
+ * Build a targeted retry prompt for failed edits in edits-mode revisions.
21
+ * Given the partially-edited plan and the list of edits that failed first
22
+ * pass, asks the planner to re-express each failed edit with corrected
23
+ * `section` and `before` values.
24
+ *
25
+ * The retry prompt is small — it does not re-include the full feedback or
26
+ * key decisions, only the failed edits and the current state of the plan.
27
+ */
28
+ export declare function buildEditsRetryPrompt(currentPlan: string, failures: Array<{
29
+ edit: {
30
+ section: string;
31
+ before: string;
32
+ after: string;
33
+ };
34
+ reason: string;
35
+ section_searched: string | null;
36
+ diagnostic?: string;
37
+ }>, structuredOutput: boolean): string;