planpong 0.5.3 → 0.5.5

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 (53) hide show
  1. package/README.md +30 -3
  2. package/dist/bin/planpong.js +2 -0
  3. package/dist/bin/planpong.js.map +1 -1
  4. package/dist/src/cli/commands/config.d.ts +2 -0
  5. package/dist/src/cli/commands/config.js +89 -0
  6. package/dist/src/cli/commands/config.js.map +1 -0
  7. package/dist/src/config/defaults.js +1 -0
  8. package/dist/src/config/defaults.js.map +1 -1
  9. package/dist/src/config/loader.d.ts +6 -0
  10. package/dist/src/config/loader.js +14 -5
  11. package/dist/src/config/loader.js.map +1 -1
  12. package/dist/src/config/mutate.d.ts +15 -0
  13. package/dist/src/config/mutate.js +112 -0
  14. package/dist/src/config/mutate.js.map +1 -0
  15. package/dist/src/core/convergence.js +26 -1
  16. package/dist/src/core/convergence.js.map +1 -1
  17. package/dist/src/core/operations.d.ts +48 -0
  18. package/dist/src/core/operations.js +81 -19
  19. package/dist/src/core/operations.js.map +1 -1
  20. package/dist/src/core/session.d.ts +1 -1
  21. package/dist/src/core/session.js +11 -2
  22. package/dist/src/core/session.js.map +1 -1
  23. package/dist/src/mcp/server.js +10 -2
  24. package/dist/src/mcp/server.js.map +1 -1
  25. package/dist/src/mcp/tools/get-config.d.ts +2 -0
  26. package/dist/src/mcp/tools/get-config.js +75 -0
  27. package/dist/src/mcp/tools/get-config.js.map +1 -0
  28. package/dist/src/mcp/tools/record-revision.d.ts +20 -0
  29. package/dist/src/mcp/tools/record-revision.js +158 -0
  30. package/dist/src/mcp/tools/record-revision.js.map +1 -0
  31. package/dist/src/mcp/tools/revise.js +14 -0
  32. package/dist/src/mcp/tools/revise.js.map +1 -1
  33. package/dist/src/mcp/tools/set-config.d.ts +2 -0
  34. package/dist/src/mcp/tools/set-config.js +81 -0
  35. package/dist/src/mcp/tools/set-config.js.map +1 -0
  36. package/dist/src/mcp/tools/start-review.js +7 -0
  37. package/dist/src/mcp/tools/start-review.js.map +1 -1
  38. package/dist/src/prompts/reviewer.d.ts +15 -7
  39. package/dist/src/prompts/reviewer.js +55 -19
  40. package/dist/src/prompts/reviewer.js.map +1 -1
  41. package/dist/src/schemas/config.d.ts +3 -0
  42. package/dist/src/schemas/config.js +8 -0
  43. package/dist/src/schemas/config.js.map +1 -1
  44. package/dist/src/schemas/feedback.d.ts +14 -35
  45. package/dist/src/schemas/feedback.js +14 -12
  46. package/dist/src/schemas/feedback.js.map +1 -1
  47. package/dist/src/schemas/metrics.d.ts +3 -0
  48. package/dist/src/schemas/metrics.js +6 -0
  49. package/dist/src/schemas/metrics.js.map +1 -1
  50. package/dist/src/schemas/session.d.ts +3 -0
  51. package/dist/src/schemas/session.js +12 -0
  52. package/dist/src/schemas/session.js.map +1 -1
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -86,18 +86,45 @@ Optional. Create `planpong.yaml` in your project root:
86
86
  ```yaml
87
87
  planner:
88
88
  provider: claude # claude or codex
89
- model: opus # provider-specific model name
89
+ model: claude-opus-4-6 # provider-specific model name
90
90
  effort: high # reasoning effort level
91
91
  reviewer:
92
92
  provider: codex
93
- model: o3
94
- effort: high
93
+ model: gpt-5.3-codex
94
+ effort: xhigh
95
95
  max_rounds: 10
96
96
  plans_dir: docs/plans
97
+ revision_mode: full # full or edits
98
+ planner_mode: external # external or inline
97
99
  ```
98
100
 
99
101
  All fields are optional. Defaults: claude (planner) + codex (reviewer), 10 rounds, `docs/plans/` directory.
100
102
 
103
+ ### Viewing and changing config
104
+
105
+ ```sh
106
+ planpong config # show resolved config with source annotations
107
+ planpong config path # print path to active config file
108
+ planpong config set <key> <value> # set a config value
109
+ ```
110
+
111
+ Examples:
112
+
113
+ ```sh
114
+ planpong config set reviewer.model gpt-5.3-codex
115
+ planpong config set max_rounds 5
116
+ planpong config set planner_mode inline
117
+ ```
118
+
119
+ Valid keys: `planner.provider`, `planner.model`, `planner.effort`, `reviewer.provider`, `reviewer.model`, `reviewer.effort`, `plans_dir`, `max_rounds`, `human_in_loop`, `revision_mode`, `planner_mode`.
120
+
121
+ ### Config via MCP
122
+
123
+ Two MCP tools are available for programmatic config access:
124
+
125
+ - **`planpong_get_config`** — returns resolved config, file path, version, and per-key source provenance
126
+ - **`planpong_set_config`** — dry-run by default (`confirm: false`); pass `confirm: true` to write
127
+
101
128
  ## What it produces
102
129
 
103
130
  Planpong updates your plan file in-place and adds a status line tracking the review:
@@ -5,6 +5,7 @@ import { dirname, join } from "node:path";
5
5
  import { Command } from "commander";
6
6
  import { registerPlanCommand } from "../src/cli/commands/plan.js";
7
7
  import { registerReviewCommand } from "../src/cli/commands/review.js";
8
+ import { registerConfigCommand } from "../src/cli/commands/config.js";
8
9
  // Read version from the installed package.json so `planpong --version`
9
10
  // always reflects the actual installed version. Hardcoding it here
10
11
  // drifts every time we cut a release.
@@ -45,5 +46,6 @@ program
45
46
  .version(readPackageVersion());
46
47
  registerPlanCommand(program);
47
48
  registerReviewCommand(program);
49
+ registerConfigCommand(program);
48
50
  program.parse();
49
51
  //# sourceMappingURL=planpong.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"planpong.js","sourceRoot":"","sources":["../../bin/planpong.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,uEAAuE;AACvE,mEAAmE;AACnE,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,mEAAmE;AACnE,sEAAsE;AACtE,8BAA8B;AAC9B,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAGtD,CAAC;gBACF,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAC/D,OAAO,GAAG,CAAC,OAAO,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM;YAC3B,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CACV,sFAAsF,CACvF;KACA,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"planpong.js","sourceRoot":"","sources":["../../bin/planpong.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,uEAAuE;AACvE,mEAAmE;AACnE,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,mEAAmE;AACnE,sEAAsE;AACtE,8BAA8B;AAC9B,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAGtD,CAAC;gBACF,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAC/D,OAAO,GAAG,CAAC,OAAO,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM;YAC3B,IAAI,GAAG,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CACV,sFAAsF,CACvF;KACA,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerConfigCommand(program: Command): void;
@@ -0,0 +1,89 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { loadConfig, findConfigPath } from "../../config/loader.js";
4
+ import { setConfigValue, getValidKeys } from "../../config/mutate.js";
5
+ export function registerConfigCommand(program) {
6
+ const configCmd = program
7
+ .command("config")
8
+ .description("View or modify planpong configuration");
9
+ configCmd
10
+ .command("path")
11
+ .description("Print the path to the active config file")
12
+ .action(() => {
13
+ const cwd = process.cwd();
14
+ const path = findConfigPath(cwd);
15
+ if (path) {
16
+ console.log(path);
17
+ }
18
+ else {
19
+ console.log("No config file found");
20
+ process.exitCode = 1;
21
+ }
22
+ });
23
+ configCmd
24
+ .command("set")
25
+ .description("Set a config value")
26
+ .argument("<key>", `Dotted config key (${getValidKeys().join(", ")})`)
27
+ .argument("<value>", "Value to set")
28
+ .action((key, value) => {
29
+ const cwd = process.cwd();
30
+ try {
31
+ const result = setConfigValue(cwd, key, value);
32
+ console.log(`${result.created ? "Created" : "Updated"} ${result.configPath}`);
33
+ console.log(` ${key}: ${String(result.before ?? "(unset)")} → ${String(result.after)}`);
34
+ // Check for shadow warnings
35
+ const effective = loadConfig({ cwd });
36
+ const parts = key.split(".");
37
+ let effectiveVal;
38
+ if (parts.length === 1) {
39
+ effectiveVal = effective[parts[0]];
40
+ }
41
+ else {
42
+ effectiveVal = effective[parts[0]]?.[parts[1]];
43
+ }
44
+ if (String(effectiveVal) !== String(result.after)) {
45
+ console.log(`\n Warning: effective value is "${String(effectiveVal)}" (overridden by CLI flag)`);
46
+ }
47
+ }
48
+ catch (err) {
49
+ console.error(`Error: ${err.message}`);
50
+ process.exitCode = 1;
51
+ }
52
+ });
53
+ // Default action: show resolved config with source annotations
54
+ configCmd.action(() => {
55
+ const cwd = process.cwd();
56
+ const configPath = findConfigPath(cwd);
57
+ const resolved = loadConfig({ cwd });
58
+ if (configPath) {
59
+ console.log(`# Config file: ${configPath}`);
60
+ }
61
+ else {
62
+ console.log("# No config file found (using defaults)");
63
+ }
64
+ console.log();
65
+ // Load file config for source detection
66
+ let fileConfig = {};
67
+ if (configPath) {
68
+ fileConfig = parseYaml(readFileSync(configPath, "utf-8")) ?? {};
69
+ }
70
+ // Print each key with source annotation
71
+ for (const key of getValidKeys()) {
72
+ const parts = key.split(".");
73
+ let fileVal;
74
+ let resolvedVal;
75
+ if (parts.length === 1) {
76
+ fileVal = fileConfig[parts[0]];
77
+ resolvedVal = resolved[parts[0]];
78
+ }
79
+ else {
80
+ fileVal = fileConfig[parts[0]]?.[parts[1]];
81
+ resolvedVal = resolved[parts[0]]?.[parts[1]];
82
+ }
83
+ const source = fileVal !== undefined ? "file" : "default";
84
+ const displayVal = resolvedVal === undefined ? "(unset)" : String(resolvedVal);
85
+ console.log(` ${key}: ${displayVal} (${source})`);
86
+ }
87
+ });
88
+ }
89
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -9,5 +9,6 @@ export const DEFAULT_CONFIG = {
9
9
  max_rounds: 10,
10
10
  human_in_loop: true,
11
11
  revision_mode: "full",
12
+ planner_mode: "external",
12
13
  };
13
14
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;KACnB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,OAAO;KAClB;IACD,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,MAAM;CACtB,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/config/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,OAAO,EAAE;QACP,QAAQ,EAAE,QAAQ;KACnB;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,OAAO;KAClB;IACD,SAAS,EAAE,YAAY;IACvB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,MAAM;IACrB,YAAY,EAAE,UAAU;CACzB,CAAC"}
@@ -1,4 +1,9 @@
1
1
  import { type PlanpongConfig } from "../schemas/config.js";
2
+ /**
3
+ * Search upward from `cwd` for a config file path.
4
+ * Returns the absolute path or null if no file is found.
5
+ */
6
+ export declare function findConfigPath(cwd: string): string | null;
2
7
  export interface LoadConfigOptions {
3
8
  cwd: string;
4
9
  /** CLI overrides — sparse, merged on top of file + defaults */
@@ -13,6 +18,7 @@ export interface LoadConfigOptions {
13
18
  maxRounds: number;
14
19
  autonomous: boolean;
15
20
  revisionMode: "edits" | "full";
21
+ plannerMode: "inline" | "external";
16
22
  }>;
17
23
  }
18
24
  export declare function loadConfig(options: LoadConfigOptions): PlanpongConfig;
@@ -10,18 +10,17 @@ const CONFIG_FILENAMES = [
10
10
  ".planpong.yml",
11
11
  ];
12
12
  /**
13
- * Search upward from `cwd` for a config file. Returns the parsed
14
- * contents or null if no file is found.
13
+ * Search upward from `cwd` for a config file path.
14
+ * Returns the absolute path or null if no file is found.
15
15
  */
16
- function findConfigFile(cwd) {
16
+ export function findConfigPath(cwd) {
17
17
  let dir = cwd;
18
18
  const root = "/";
19
19
  while (true) {
20
20
  for (const filename of CONFIG_FILENAMES) {
21
21
  const candidate = join(dir, filename);
22
22
  if (existsSync(candidate)) {
23
- const raw = readFileSync(candidate, "utf-8");
24
- return parseYaml(raw);
23
+ return candidate;
25
24
  }
26
25
  }
27
26
  const parent = join(dir, "..");
@@ -31,6 +30,13 @@ function findConfigFile(cwd) {
31
30
  }
32
31
  return null;
33
32
  }
33
+ function findConfigFile(cwd) {
34
+ const path = findConfigPath(cwd);
35
+ if (!path)
36
+ return null;
37
+ const raw = readFileSync(path, "utf-8");
38
+ return parseYaml(raw);
39
+ }
34
40
  export function loadConfig(options) {
35
41
  const fileConfig = findConfigFile(options.cwd) ?? {};
36
42
  const overrides = options.overrides ?? {};
@@ -71,6 +77,9 @@ export function loadConfig(options) {
71
77
  revision_mode: overrides.revisionMode ??
72
78
  fileConfig.revision_mode ??
73
79
  DEFAULT_CONFIG.revision_mode,
80
+ planner_mode: overrides.plannerMode ??
81
+ fileConfig.planner_mode ??
82
+ DEFAULT_CONFIG.planner_mode,
74
83
  };
75
84
  return PlanpongConfigSchema.parse(merged);
76
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ declare const VALID_KEYS: readonly ["planner.provider", "planner.model", "planner.effort", "reviewer.provider", "reviewer.model", "reviewer.effort", "plans_dir", "max_rounds", "human_in_loop", "revision_mode", "planner_mode"];
2
+ export type ValidKey = (typeof VALID_KEYS)[number];
3
+ export interface SetConfigResult {
4
+ configPath: string;
5
+ key: string;
6
+ before: unknown;
7
+ after: unknown;
8
+ created: boolean;
9
+ }
10
+ export declare function isValidKey(key: string): key is ValidKey;
11
+ export declare function getValidKeys(): readonly string[];
12
+ export declare function setConfigValue(cwd: string, key: string, rawValue: string, opts?: {
13
+ dryRun?: boolean;
14
+ }): SetConfigResult;
15
+ export {};
@@ -0,0 +1,112 @@
1
+ import { readFileSync, writeFileSync, renameSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parseDocument } from "yaml";
4
+ import { ZodError } from "zod";
5
+ import { PlanpongConfigSchema } from "../schemas/config.js";
6
+ import { findConfigPath } from "./loader.js";
7
+ import { loadConfig } from "./loader.js";
8
+ const VALID_KEYS = [
9
+ "planner.provider",
10
+ "planner.model",
11
+ "planner.effort",
12
+ "reviewer.provider",
13
+ "reviewer.model",
14
+ "reviewer.effort",
15
+ "plans_dir",
16
+ "max_rounds",
17
+ "human_in_loop",
18
+ "revision_mode",
19
+ "planner_mode",
20
+ ];
21
+ export function isValidKey(key) {
22
+ return VALID_KEYS.includes(key);
23
+ }
24
+ export function getValidKeys() {
25
+ return VALID_KEYS;
26
+ }
27
+ function coerceValue(key, raw) {
28
+ if (key === "max_rounds") {
29
+ const n = Number(raw);
30
+ if (Number.isNaN(n))
31
+ throw new Error(`Invalid number for ${key}: ${raw}`);
32
+ return n;
33
+ }
34
+ if (key === "human_in_loop") {
35
+ if (raw === "true")
36
+ return true;
37
+ if (raw === "false")
38
+ return false;
39
+ throw new Error(`Invalid boolean for ${key}: ${raw} (expected "true" or "false")`);
40
+ }
41
+ return raw;
42
+ }
43
+ function getNestedValue(obj, key) {
44
+ const parts = key.split(".");
45
+ let current = obj;
46
+ for (const part of parts) {
47
+ if (current == null || typeof current !== "object")
48
+ return undefined;
49
+ current = current[part];
50
+ }
51
+ return current;
52
+ }
53
+ export function setConfigValue(cwd, key, rawValue, opts) {
54
+ if (!isValidKey(key)) {
55
+ throw new Error(`Unknown config key: "${key}". Valid keys: ${VALID_KEYS.join(", ")}`);
56
+ }
57
+ const value = coerceValue(key, rawValue);
58
+ const existingPath = findConfigPath(cwd);
59
+ const configPath = existingPath ?? join(cwd, "planpong.yaml");
60
+ const created = !existingPath;
61
+ const raw = existingPath ? readFileSync(existingPath, "utf-8") : "";
62
+ const doc = parseDocument(raw);
63
+ const parts = key.split(".");
64
+ const before = getNestedValue(doc.toJSON() ?? {}, key);
65
+ if (parts.length === 1) {
66
+ doc.set(parts[0], value);
67
+ }
68
+ else {
69
+ let node = doc.get(parts[0], true);
70
+ if (node == null || typeof node !== "object" || !("set" in node)) {
71
+ doc.set(parts[0], { [parts[1]]: value });
72
+ }
73
+ else {
74
+ node.set(parts[1], value);
75
+ }
76
+ }
77
+ // Validate the full merged config would be valid
78
+ const merged = doc.toJSON();
79
+ const testConfig = { ...loadConfig({ cwd }).valueOf() };
80
+ if (parts.length === 1) {
81
+ testConfig[parts[0]] = value;
82
+ }
83
+ else {
84
+ const section = testConfig[parts[0]] ?? {};
85
+ section[parts[1]] = value;
86
+ testConfig[parts[0]] = section;
87
+ }
88
+ try {
89
+ PlanpongConfigSchema.parse(testConfig);
90
+ }
91
+ catch (err) {
92
+ if (err instanceof ZodError) {
93
+ const msg = err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
94
+ throw new Error(`Invalid value for "${key}": ${msg}`);
95
+ }
96
+ throw err;
97
+ }
98
+ if (!opts?.dryRun) {
99
+ const output = doc.toString();
100
+ const tmpPath = configPath + ".tmp." + process.pid;
101
+ writeFileSync(tmpPath, output, "utf-8");
102
+ renameSync(tmpPath, configPath);
103
+ }
104
+ return {
105
+ configPath,
106
+ key,
107
+ before,
108
+ after: value,
109
+ created,
110
+ };
111
+ }
112
+ //# sourceMappingURL=mutate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../../src/config/mutate.ts"],"names":[],"mappings":"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"}
@@ -59,7 +59,27 @@ export function parseFeedback(content) {
59
59
  catch {
60
60
  throw new Error(`Invalid JSON in reviewer output:\n${json.slice(0, 200)}`);
61
61
  }
62
- return ReviewFeedbackSchema.parse(parsed);
62
+ const validated = ReviewFeedbackSchema.parse(parsed);
63
+ return coerceApprovedWithNotes(validated);
64
+ }
65
+ /**
66
+ * Post-parse coercion for `approved_with_notes` verdicts paired with non-P3
67
+ * issues. Previously enforced as a Zod refinement which threw a terminal
68
+ * `ZodValidationError`. Moved here so semantically-recoverable violations
69
+ * downgrade to `needs_revision` with a warning rather than killing the round.
70
+ *
71
+ * Applied by every parser in this file. Direction/risk schemas can't produce
72
+ * `approved_with_notes` so the verdict-shape narrowing makes this a no-op
73
+ * for them when called on a `PhaseFeedback`.
74
+ */
75
+ function coerceApprovedWithNotes(feedback) {
76
+ if (feedback.verdict !== "approved_with_notes")
77
+ return feedback;
78
+ const hasNonP3 = feedback.issues.some((i) => i.severity !== "P3");
79
+ if (!hasNonP3)
80
+ return feedback;
81
+ console.warn("[planpong] approved_with_notes with non-P3 issues — coercing to needs_revision");
82
+ return { ...feedback, verdict: "needs_revision" };
63
83
  }
64
84
  function parseDirectionFeedback(content) {
65
85
  const json = extractJSON(content, "planpong-feedback");
@@ -191,6 +211,11 @@ export function parseStructuredFeedbackForPhase(content, phase, planText = "") {
191
211
  feedback = { ...risk, verdict: "needs_revision" };
192
212
  }
193
213
  }
214
+ // Coerce `approved_with_notes` + non-P3 issues to `needs_revision`. The
215
+ // refinement that previously enforced this as a Zod check has been moved
216
+ // out of the schema so the violation produces a recoverable warning, not
217
+ // a terminal ZodValidationError.
218
+ feedback = coerceApprovedWithNotes(feedback);
194
219
  // Evidence verification — model-supplied `verified` is stripped, then
195
220
  // each issue's `quoted_text` is checked against the plan. The verifier
196
221
  // is fail-safe: an exception path produces `verified: false`, never an
@@ -1 +1 @@
1
- {"version":3,"file":"convergence.js","sourceRoot":"","sources":["../../../src/core/convergence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convergence.js","sourceRoot":"","sources":["../../../src/core/convergence.ts"],"names":[],"mappings":"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"}
@@ -85,6 +85,54 @@ export declare function runReviewRound(session: Session, cwd: string, config: Pl
85
85
  * Run a single revision round: send plan + feedback to the planner for revision.
86
86
  */
87
87
  export declare function runRevisionRound(session: Session, cwd: string, config: PlanpongConfig, plannerProvider: Provider): Promise<RevisionRoundResult>;
88
+ export interface FinalizeRevisionInput {
89
+ session: Session;
90
+ cwd: string;
91
+ round: number;
92
+ revision: PlannerRevision;
93
+ /** Absolute path to the plan file. Used for the post-revision hash. */
94
+ planPath: string;
95
+ }
96
+ export interface FinalizeRevisionResult {
97
+ accepted: number;
98
+ rejected: number;
99
+ deferred: number;
100
+ /**
101
+ * `true` when this call wrote artifacts; `false` when an existing
102
+ * matching response file was detected and finalization was a no-op.
103
+ * Idempotent on retries — the first writer wins, subsequent identical
104
+ * calls return the existing tally without re-writing.
105
+ */
106
+ fresh: boolean;
107
+ }
108
+ /**
109
+ * Persist the final revision artifacts and return the response tally.
110
+ * Shared by `runRevisionRound` (external mode) and
111
+ * `planpong_record_revision` (inline mode) so both paths produce identical
112
+ * on-disk shape.
113
+ *
114
+ * Write ordering (the contract):
115
+ * 1. `round-N-response.json` — the revision payload
116
+ * 2. plan hash — `session.planHash = hashFile(planPath)`
117
+ * 3. `session.json` — session state (commit point)
118
+ *
119
+ * Step 3 is the commit point. A crash before step 3 leaves a stale
120
+ * `round-N-response.json` and an unchanged `session.planHash`; a retry
121
+ * re-enters with the same round number and overwrites the response file
122
+ * (idempotent at this granularity).
123
+ *
124
+ * **Round advancement is NOT performed here.** `currentRound` is owned by
125
+ * the callers that drive the loop: `get-feedback.ts:63` for the MCP path
126
+ * (`session.currentRound++`) and `loop.ts` for the CLI path. Moving
127
+ * advancement into finalization would double-advance in MCP mode.
128
+ *
129
+ * Idempotency: if `round-N-response.json` already exists and its content
130
+ * matches the proposed revision, returns the existing tally without
131
+ * re-writing. Detects retries from upstream (e.g., a stale tool call
132
+ * after a successful finalization) without relying on round-number
133
+ * comparison — `currentRound` is owned elsewhere.
134
+ */
135
+ export declare function finalizeRevision({ session, cwd, round, revision, planPath, }: FinalizeRevisionInput): FinalizeRevisionResult;
88
136
  /**
89
137
  * Mark the session as approved and update the plan's status line.
90
138
  */