planpong 0.5.7 → 0.6.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 (68) hide show
  1. package/README.md +53 -14
  2. package/dist/bin/planpong.js +4 -0
  3. package/dist/bin/planpong.js.map +1 -1
  4. package/dist/src/cli/commands/config.d.ts +10 -0
  5. package/dist/src/cli/commands/config.js +65 -0
  6. package/dist/src/cli/commands/config.js.map +1 -1
  7. package/dist/src/cli/commands/init.d.ts +53 -0
  8. package/dist/src/cli/commands/init.js +221 -0
  9. package/dist/src/cli/commands/init.js.map +1 -0
  10. package/dist/src/cli/commands/plan.js +7 -7
  11. package/dist/src/cli/commands/plan.js.map +1 -1
  12. package/dist/src/cli/commands/review.js +7 -7
  13. package/dist/src/cli/commands/review.js.map +1 -1
  14. package/dist/src/cli/ui.js +11 -19
  15. package/dist/src/cli/ui.js.map +1 -1
  16. package/dist/src/config/loader.d.ts +5 -0
  17. package/dist/src/config/loader.js +21 -1
  18. package/dist/src/config/loader.js.map +1 -1
  19. package/dist/src/config/mutate.d.ts +26 -0
  20. package/dist/src/config/mutate.js +51 -38
  21. package/dist/src/config/mutate.js.map +1 -1
  22. package/dist/src/core/convergence.js +1 -1
  23. package/dist/src/core/convergence.js.map +1 -1
  24. package/dist/src/core/operations.d.ts +44 -1
  25. package/dist/src/core/operations.js +110 -37
  26. package/dist/src/core/operations.js.map +1 -1
  27. package/dist/src/core/presentation.d.ts +39 -0
  28. package/dist/src/core/presentation.js +132 -0
  29. package/dist/src/core/presentation.js.map +1 -0
  30. package/dist/src/core/round-state.d.ts +15 -0
  31. package/dist/src/core/round-state.js +49 -0
  32. package/dist/src/core/round-state.js.map +1 -0
  33. package/dist/src/core/session.d.ts +1 -0
  34. package/dist/src/core/session.js +60 -1
  35. package/dist/src/core/session.js.map +1 -1
  36. package/dist/src/mcp/server.js +6 -6
  37. package/dist/src/mcp/server.js.map +1 -1
  38. package/dist/src/mcp/tools/get-feedback.d.ts +1 -2
  39. package/dist/src/mcp/tools/get-feedback.js +154 -56
  40. package/dist/src/mcp/tools/get-feedback.js.map +1 -1
  41. package/dist/src/mcp/tools/record-revision.d.ts +0 -6
  42. package/dist/src/mcp/tools/record-revision.js +170 -95
  43. package/dist/src/mcp/tools/record-revision.js.map +1 -1
  44. package/dist/src/mcp/tools/revise.d.ts +1 -7
  45. package/dist/src/mcp/tools/revise.js +126 -90
  46. package/dist/src/mcp/tools/revise.js.map +1 -1
  47. package/dist/src/mcp/tools/status.js +18 -1
  48. package/dist/src/mcp/tools/status.js.map +1 -1
  49. package/dist/src/providers/claude.d.ts +22 -1
  50. package/dist/src/providers/claude.js +10 -10
  51. package/dist/src/providers/claude.js.map +1 -1
  52. package/dist/src/providers/codex.d.ts +12 -1
  53. package/dist/src/providers/codex.js +6 -3
  54. package/dist/src/providers/codex.js.map +1 -1
  55. package/dist/src/providers/gemini.d.ts +58 -0
  56. package/dist/src/providers/gemini.js +169 -0
  57. package/dist/src/providers/gemini.js.map +1 -0
  58. package/dist/src/providers/registry.js +8 -2
  59. package/dist/src/providers/registry.js.map +1 -1
  60. package/dist/src/providers/shared.d.ts +16 -0
  61. package/dist/src/providers/shared.js +22 -0
  62. package/dist/src/providers/shared.js.map +1 -0
  63. package/dist/src/providers/types.d.ts +1 -1
  64. package/dist/src/schemas/metrics.d.ts +14 -14
  65. package/dist/src/schemas/metrics.js +13 -2
  66. package/dist/src/schemas/metrics.js.map +1 -1
  67. package/dist/src/schemas/session.d.ts +2 -2
  68. package/package.json +3 -2
package/README.md CHANGED
@@ -17,15 +17,19 @@ The planner model evaluates each piece of feedback independently — accepting,
17
17
  You need at least **one AI CLI** installed and authenticated:
18
18
 
19
19
  - **Claude Code** — `npm install -g @anthropic-ai/claude-code` (Anthropic API key or Max subscription)
20
- - **Codex CLI** — `npm install -g @openai/codex` (OpenAI API key)
20
+ - **Codex CLI** — `npm install -g @openai/codex` (ChatGPT account or OpenAI API key)
21
+ - **Gemini CLI** — `npm install -g @google/gemini-cli` (Google account auth — run `gemini` once to authenticate)
21
22
 
22
- If both are installed, planpong uses one for planning and the other for reviewing (configurable). If only one is available, it auto-fallbacks to using that CLI for both roles.
23
+ If multiple are installed, planpong uses one for planning and a different one for reviewing (configurable). If only one is available, it auto-fallbacks to using that CLI for both roles.
24
+
25
+ > **Note on gemini as reviewer:** the gemini CLI does not expose a stable session-resume mechanism, so reviewer rounds run without persistent context. Expect noticeably slower per-round wall time than claude or codex when gemini is the reviewer. The first time you load a config that selects gemini as reviewer, planpong prints a stderr warning.
23
26
 
24
27
  Verify your CLI works:
25
28
 
26
29
  ```sh
27
30
  claude --version # or
28
- codex --version
31
+ codex --version # or
32
+ gemini --version
29
33
  ```
30
34
 
31
35
  Planpong shells out to these CLIs — no API keys are configured in planpong itself.
@@ -36,6 +40,14 @@ Planpong shells out to these CLIs — no API keys are configured in planpong its
36
40
  npm install -g planpong
37
41
  ```
38
42
 
43
+ Then run the interactive setup wizard:
44
+
45
+ ```sh
46
+ planpong init
47
+ ```
48
+
49
+ The wizard auto-detects which AI CLIs you have installed, lets you pick a planner + reviewer, and writes a working `planpong.yaml` for the current project. You can re-run it any time to tweak settings — only changed keys are written.
50
+
39
51
  ## Setup (Claude Code MCP)
40
52
 
41
53
  Add planpong as an MCP server so Claude Code can use it as a native tool:
@@ -69,8 +81,11 @@ Review my plan at docs/plans/my-feature.md using planpong
69
81
  Or use the slash commands (auto-installed with the MCP server):
70
82
 
71
83
  ```
72
- /planpong:review docs/plans/my-feature.md # autonomous — runs to completion
73
- /planpong:review_interactive docs/plans/my-feature.md # pauses between rounds for your input
84
+ /planpong:review docs/plans/my-feature.md # autonomous — runs to completion
85
+ /planpong:review_interactive docs/plans/my-feature.md # pauses between rounds for your input
86
+ /planpong:status <session_id> # current state and round history
87
+ /planpong:sessions # list all review sessions in this project
88
+ /planpong:report <session_id> # detailed phase-specific report (direction confidence, risk register, round history)
74
89
  ```
75
90
 
76
91
  ### Via CLI
@@ -81,42 +96,56 @@ planpong review docs/plans/my-feature.md
81
96
 
82
97
  ## Configuration
83
98
 
84
- Optional. Create `planpong.yaml` in your project root:
99
+ Optional. Run `planpong init` to generate this interactively, or create `planpong.yaml` in your project root by hand:
85
100
 
86
101
  ```yaml
87
102
  planner:
88
- provider: claude # claude or codex
89
- model: claude-opus-4-6 # provider-specific model name
90
- effort: high # reasoning effort level
103
+ provider: claude # claude, codex, or gemini
104
+ model: opus # provider-specific; aliases or full IDs both work
91
105
  reviewer:
92
106
  provider: codex
93
107
  model: gpt-5.3-codex
94
- effort: xhigh
108
+ effort: xhigh # codex-only knob: low | medium | high | xhigh
95
109
  max_rounds: 10
96
110
  plans_dir: docs/plans
97
111
  revision_mode: full # full or edits
98
- planner_mode: external # external or inline
112
+ planner_mode: inline # inline or external (see below)
99
113
  ```
100
114
 
101
- All fields are optional. Defaults: claude (planner) + codex (reviewer), 10 rounds, `docs/plans/` directory.
115
+ > Valid `model` and `effort` values are provider-specific and change as providers ship new versions. Run `planpong config providers` to see the current per-provider lists, or `planpong init` for an interactive picker — don't copy the values above verbatim.
116
+
117
+ All fields are optional. Defaults: claude (planner) + codex (reviewer), 10 rounds, `docs/plans/` directory, `planner_mode: inline`, `revision_mode: full`, `human_in_loop: true`.
118
+
119
+ ### Planner mode: inline vs external
120
+
121
+ `planner_mode` is the most consequential operational choice. It decides who actually rewrites the plan after each round of feedback:
122
+
123
+ - **`inline` (default)** — when you're driving planpong from Claude Code, *you* are the planner. Planpong returns the reviewer's issues; Claude reads the plan, edits it directly, and reports its accept/reject/defer decisions back via `planpong_record_revision`. No second model is invoked, so revisions are fast and use the conversational context Claude already has.
124
+ - **`external`** — planpong shells out to the configured planner provider (e.g. another `claude -p` or `codex exec` invocation) to produce the revision. Use this when running planpong outside Claude Code (CLI flow), or when you want a different model to plan than the one orchestrating.
125
+
126
+ Inline is the right default for the Claude-Code-as-orchestrator workflow; external is the right default for `planpong review` from a plain shell.
102
127
 
103
128
  ### Viewing and changing config
104
129
 
105
130
  ```sh
106
131
  planpong config # show resolved config with source annotations
107
132
  planpong config path # print path to active config file
133
+ planpong config keys # list all keys with valid values, types, and defaults
134
+ planpong config providers # list per-provider model and effort values
135
+ planpong config get <key> # print a single resolved value
108
136
  planpong config set <key> <value> # set a config value
109
137
  ```
110
138
 
111
139
  Examples:
112
140
 
113
141
  ```sh
114
- planpong config set reviewer.model gpt-5.3-codex
142
+ planpong config set reviewer.provider gemini
143
+ planpong config set reviewer.model gemini-2.5-pro
115
144
  planpong config set max_rounds 5
116
145
  planpong config set planner_mode inline
117
146
  ```
118
147
 
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`.
148
+ 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`. Run `planpong config keys` for the canonical list with descriptions.
120
149
 
121
150
  ### Config via MCP
122
151
 
@@ -125,6 +154,16 @@ Two MCP tools are available for programmatic config access:
125
154
  - **`planpong_get_config`** — returns resolved config, file path, version, and per-key source provenance
126
155
  - **`planpong_set_config`** — dry-run by default (`confirm: false`); pass `confirm: true` to write
127
156
 
157
+ ### MCP API notes
158
+
159
+ Planpong's MCP tools are designed to be safe under retries, duplicated calls, and orchestrator restarts:
160
+
161
+ - **`planpong_revise` and `planpong_record_revision` require `expected_round`.** Pass the round number returned by the most recent `planpong_get_feedback`. Stale calls (round mismatched lower) and out-of-order calls (mismatched higher) return precise errors instead of double-charging the planner.
162
+ - **Tool calls are replay-safe.** Calling `planpong_get_feedback` twice before the round's revision returns the existing feedback with `idempotent_replay: true` instead of re-invoking the reviewer. The same applies to `planpong_revise` and `planpong_record_revision` when the round's response artifact already exists.
163
+ - **Per-session lock.** Mutating MCP tools acquire an exclusive lock at `.planpong/sessions/<id>/lock` so two overlapping clients cannot both advance the same session.
164
+
165
+ Most users driving planpong through Claude Code never see these primitives — the slash commands and the orchestrator's instructions handle them. They matter if you're building an external MCP client.
166
+
128
167
  ## What it produces
129
168
 
130
169
  Planpong updates your plan file in-place and adds a status line tracking the review:
@@ -6,6 +6,7 @@ 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
8
  import { registerConfigCommand } from "../src/cli/commands/config.js";
9
+ import { registerInitCommand } from "../src/cli/commands/init.js";
9
10
  // Read version from the installed package.json so `planpong --version`
10
11
  // always reflects the actual installed version. Hardcoding it here
11
12
  // drifts every time we cut a release.
@@ -46,8 +47,10 @@ program
46
47
  .version(readPackageVersion())
47
48
  .addHelpText("after", `
48
49
  Quick reference:
50
+ planpong init Interactive first-run setup wizard
49
51
  planpong config Show current config values and sources
50
52
  planpong config keys List all settings with valid values and defaults
53
+ planpong config providers List per-provider model and effort values
51
54
  planpong config get <key> Get a single setting
52
55
  planpong config set <key> <value> Change a setting
53
56
 
@@ -56,5 +59,6 @@ Quick reference:
56
59
  registerPlanCommand(program);
57
60
  registerReviewCommand(program);
58
61
  registerConfigCommand(program);
62
+ registerInitCommand(program);
59
63
  program.parse();
60
64
  //# 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;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;KAC7B,WAAW,CACV,OAAO,EACP;;;;;;;;6DAQyD,CAC1D,CAAC;AAEJ,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"}
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;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,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;KAC7B,WAAW,CACV,OAAO,EACP;;;;;;;;;;6DAUyD,CAC1D,CAAC;AAEJ,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,2 +1,12 @@
1
1
  import type { Command } from "commander";
2
+ /**
3
+ * Soft-validate a config value against the enumerated lists in the provider
4
+ * registry. Returns a warning string if the value isn't recognized, or null
5
+ * if it's known (or there's nothing to check against).
6
+ *
7
+ * Soft because providers accept newer model IDs that may not be in the
8
+ * hardcoded MODELS array — we want to nudge typos without blocking power
9
+ * users from setting valid-but-unenumerated values.
10
+ */
11
+ export declare function getUnknownValueWarning(key: string, value: string, providerForRole: string | undefined): string | null;
2
12
  export declare function registerConfigCommand(program: Command): void;
@@ -2,6 +2,42 @@ import { readFileSync } from "node:fs";
2
2
  import { parse as parseYaml } from "yaml";
3
3
  import { loadConfig, findConfigPath } from "../../config/loader.js";
4
4
  import { setConfigValue, getValidKeys, getKeyMetadata, getKeyMeta } from "../../config/mutate.js";
5
+ import { getAllProviders, getProvider } from "../../providers/registry.js";
6
+ /**
7
+ * Soft-validate a config value against the enumerated lists in the provider
8
+ * registry. Returns a warning string if the value isn't recognized, or null
9
+ * if it's known (or there's nothing to check against).
10
+ *
11
+ * Soft because providers accept newer model IDs that may not be in the
12
+ * hardcoded MODELS array — we want to nudge typos without blocking power
13
+ * users from setting valid-but-unenumerated values.
14
+ */
15
+ export function getUnknownValueWarning(key, value, providerForRole) {
16
+ if (key === "planner.provider" || key === "reviewer.provider") {
17
+ const valid = getAllProviders().map((p) => p.name);
18
+ if (valid.includes(value))
19
+ return null;
20
+ return `Warning: "${value}" is not a known provider. Known: ${valid.join(", ")}.`;
21
+ }
22
+ const isModel = key === "planner.model" || key === "reviewer.model";
23
+ const isEffort = key === "planner.effort" || key === "reviewer.effort";
24
+ if (!isModel && !isEffort)
25
+ return null;
26
+ if (!providerForRole)
27
+ return null;
28
+ const provider = getProvider(providerForRole);
29
+ if (!provider)
30
+ return null;
31
+ const valid = isModel ? provider.getModels() : provider.getEffortLevels();
32
+ if (valid.length === 0)
33
+ return null;
34
+ if (valid.includes(value))
35
+ return null;
36
+ const what = isModel ? "model" : "effort level";
37
+ return (`Warning: "${value}" is not in ${providerForRole}'s known ${what} list ` +
38
+ `(${valid.join(", ")}). The provider may still accept it. ` +
39
+ `Run 'planpong config providers' to see current lists.`);
40
+ }
5
41
  function formatKeyList() {
6
42
  return getKeyMetadata()
7
43
  .map((m) => ` ${m.key.padEnd(20)} ${m.values.padEnd(28)} ${m.description}`)
@@ -43,6 +79,10 @@ export function registerConfigCommand(program) {
43
79
  .command("keys")
44
80
  .description("List all config keys with descriptions, valid values, and defaults")
45
81
  .action(() => printKeysTable());
82
+ configCmd
83
+ .command("providers")
84
+ .description("List providers with their valid model and effort values")
85
+ .action(() => printProvidersTable());
46
86
  configCmd
47
87
  .command("path")
48
88
  .description("Print the path to the active config file")
@@ -89,6 +129,17 @@ export function registerConfigCommand(program) {
89
129
  if (String(effectiveVal) !== String(result.after)) {
90
130
  console.log(`\n Warning: effective value is "${String(effectiveVal)}" (overridden by CLI flag)`);
91
131
  }
132
+ // Soft-validate the value against the provider registry. We don't
133
+ // reject because providers accept additional model IDs beyond the
134
+ // enumerated lists — but a typo deserves a nudge.
135
+ const role = parts[0];
136
+ const providerForRole = role === "planner" || role === "reviewer"
137
+ ? effective[role]?.provider
138
+ : undefined;
139
+ const warning = getUnknownValueWarning(key, value, providerForRole);
140
+ if (warning) {
141
+ console.error(`\n ${warning}`);
142
+ }
92
143
  }
93
144
  catch (err) {
94
145
  console.error(`Error: ${err.message}`);
@@ -114,6 +165,20 @@ function printKeysTable() {
114
165
  m.default.padEnd(defW) +
115
166
  m.description);
116
167
  }
168
+ console.log("\nFor per-provider model and effort values, run 'planpong config providers'.");
169
+ }
170
+ function printProvidersTable() {
171
+ const providers = getAllProviders();
172
+ for (const p of providers) {
173
+ const models = p.getModels();
174
+ const efforts = p.getEffortLevels();
175
+ console.log(p.name);
176
+ console.log(` models: ${models.length > 0 ? models.join(", ") : "(none enumerated)"}`);
177
+ console.log(` effort: ${efforts.length > 0 ? efforts.join(", ") : "(none enumerated)"}`);
178
+ console.log();
179
+ }
180
+ console.log("Note: providers may accept additional model IDs not listed here (e.g. newly-released versions).");
181
+ console.log("Run 'planpong init' for an interactive picker against the same lists.");
117
182
  }
118
183
  function showConfig() {
119
184
  const cwd = process.cwd();
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Command } from "commander";
2
+ import { type BatchPick } from "../../config/mutate.js";
3
+ export interface WizardAnswers {
4
+ plannerProvider: string;
5
+ plannerModel: string;
6
+ reviewerProvider: string;
7
+ reviewerModel: string;
8
+ maxRounds: number;
9
+ plansDir: string;
10
+ plannerMode: "inline" | "external";
11
+ }
12
+ export interface DiskSnapshot {
13
+ planner?: {
14
+ provider?: string;
15
+ model?: string;
16
+ };
17
+ reviewer?: {
18
+ provider?: string;
19
+ model?: string;
20
+ };
21
+ max_rounds?: number;
22
+ plans_dir?: string;
23
+ planner_mode?: "inline" | "external";
24
+ }
25
+ /**
26
+ * Read planpong.yaml directly into a partial snapshot. Unlike loadConfig(),
27
+ * this does NOT merge defaults — fields the user never wrote remain
28
+ * undefined so the wizard can omit them from the batch write.
29
+ */
30
+ export declare function readDiskSnapshot(cwd: string): DiskSnapshot;
31
+ /**
32
+ * Pure formatter for the post-write summary. The auth reminder appears
33
+ * whenever gemini is picked for any role; it is intentionally a static
34
+ * message rather than a probe of auth state.
35
+ */
36
+ export declare function formatPostWriteSummary(answers: WizardAnswers): string;
37
+ /**
38
+ * Convert the wizard's answer object plus the on-disk-file snapshot into
39
+ * the batch picks list. Omits keys whose answer matches the on-disk value
40
+ * so the wizard never writes a default into an existing yaml the user
41
+ * didn't touch. Output order is stable to keep diff output predictable.
42
+ */
43
+ export declare function answersToPicks(answers: WizardAnswers, disk: DiskSnapshot): BatchPick[];
44
+ /**
45
+ * Detect whether stdin is a real TTY. Node sets `isTTY` to `true` for a TTY
46
+ * and leaves it `undefined` (NOT `false`) for pipes/redirects, so a strict
47
+ * `=== false` check would silently let the wizard fall through to inquirer
48
+ * and hang on the first prompt.
49
+ */
50
+ export declare function isInteractiveTty(stdin: {
51
+ isTTY?: boolean;
52
+ }): boolean;
53
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,221 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { select, input, confirm } from "@inquirer/prompts";
5
+ import chalk from "chalk";
6
+ import { setConfigValuesBatch, } from "../../config/mutate.js";
7
+ import { getAllProviders, getInstallHint, } from "../../providers/registry.js";
8
+ const CONFIG_FILENAMES = [
9
+ "planpong.yaml",
10
+ "planpong.yml",
11
+ ".planpong.yaml",
12
+ ".planpong.yml",
13
+ ];
14
+ const GEMINI_REVIEWER_INLINE_WARNING = "warning: gemini reviewer rounds run without persistent session resumption.\n" +
15
+ " expect noticeably slower per-round wall time than claude/codex.\n" +
16
+ " tracked: see Future work in docs/plans/gemini-and-init-wizard.md";
17
+ /**
18
+ * Read planpong.yaml directly into a partial snapshot. Unlike loadConfig(),
19
+ * this does NOT merge defaults — fields the user never wrote remain
20
+ * undefined so the wizard can omit them from the batch write.
21
+ */
22
+ export function readDiskSnapshot(cwd) {
23
+ for (const filename of CONFIG_FILENAMES) {
24
+ const candidate = join(cwd, filename);
25
+ if (existsSync(candidate)) {
26
+ const raw = readFileSync(candidate, "utf-8");
27
+ return parseYaml(raw) ?? {};
28
+ }
29
+ }
30
+ return {};
31
+ }
32
+ /**
33
+ * Pure formatter for the post-write summary. The auth reminder appears
34
+ * whenever gemini is picked for any role; it is intentionally a static
35
+ * message rather than a probe of auth state.
36
+ */
37
+ export function formatPostWriteSummary(answers) {
38
+ const lines = [];
39
+ lines.push("");
40
+ lines.push("Run 'planpong review <plan-file>' to start a review, or", " 'planpong plan <requirements>' to generate a new plan.");
41
+ if (answers.plannerProvider === "gemini" ||
42
+ answers.reviewerProvider === "gemini") {
43
+ lines.push("");
44
+ lines.push("Note: gemini requires Google account auth. Run `gemini` once", " before invoking planpong if you haven't already.");
45
+ }
46
+ return lines.join("\n");
47
+ }
48
+ /**
49
+ * Convert the wizard's answer object plus the on-disk-file snapshot into
50
+ * the batch picks list. Omits keys whose answer matches the on-disk value
51
+ * so the wizard never writes a default into an existing yaml the user
52
+ * didn't touch. Output order is stable to keep diff output predictable.
53
+ */
54
+ export function answersToPicks(answers, disk) {
55
+ const picks = [];
56
+ const add = (key, answer, diskValue) => {
57
+ if (answer === diskValue)
58
+ return;
59
+ picks.push({ key, rawValue: String(answer) });
60
+ };
61
+ add("planner.provider", answers.plannerProvider, disk.planner?.provider);
62
+ add("planner.model", answers.plannerModel, disk.planner?.model);
63
+ add("reviewer.provider", answers.reviewerProvider, disk.reviewer?.provider);
64
+ add("reviewer.model", answers.reviewerModel, disk.reviewer?.model);
65
+ add("max_rounds", answers.maxRounds, disk.max_rounds);
66
+ add("plans_dir", answers.plansDir, disk.plans_dir);
67
+ add("planner_mode", answers.plannerMode, disk.planner_mode);
68
+ return picks;
69
+ }
70
+ async function probeProviders() {
71
+ const all = getAllProviders();
72
+ return Promise.all(all.map(async (p) => ({ provider: p, available: await p.isAvailable() })));
73
+ }
74
+ function printDetectionTable(statuses) {
75
+ console.log(chalk.bold("\nDetected CLIs:"));
76
+ for (const s of statuses) {
77
+ const mark = s.available ? chalk.green("✓") : chalk.dim("✗");
78
+ const name = s.provider.name.padEnd(8);
79
+ if (s.available) {
80
+ console.log(` ${mark} ${name}available`);
81
+ }
82
+ else {
83
+ console.log(` ${mark} ${name}${chalk.dim("not installed — " + getInstallHint(s.provider.name))}`);
84
+ }
85
+ }
86
+ console.log();
87
+ }
88
+ /**
89
+ * Detect whether stdin is a real TTY. Node sets `isTTY` to `true` for a TTY
90
+ * and leaves it `undefined` (NOT `false`) for pipes/redirects, so a strict
91
+ * `=== false` check would silently let the wizard fall through to inquirer
92
+ * and hang on the first prompt.
93
+ */
94
+ export function isInteractiveTty(stdin) {
95
+ return stdin.isTTY === true;
96
+ }
97
+ async function runWizard(cwd) {
98
+ if (!isInteractiveTty(process.stdin)) {
99
+ process.stderr.write("planpong init must run interactively. Use 'planpong config set <key> <value>' for scripted setup.\n");
100
+ process.exitCode = 1;
101
+ return;
102
+ }
103
+ console.log(chalk.bold("\nplanpong init") + chalk.dim(" — first-run setup\n"));
104
+ const statuses = await probeProviders();
105
+ printDetectionTable(statuses);
106
+ const installed = statuses.filter((s) => s.available);
107
+ if (installed.length === 0) {
108
+ console.error(chalk.red("No supported AI CLIs are installed."), "Install at least one of:");
109
+ for (const s of statuses) {
110
+ console.error(` - ${getInstallHint(s.provider.name)}`);
111
+ }
112
+ process.exitCode = 1;
113
+ return;
114
+ }
115
+ const disk = readDiskSnapshot(cwd);
116
+ const installedChoices = installed.map((s) => ({
117
+ name: s.provider.name,
118
+ value: s.provider.name,
119
+ }));
120
+ const plannerProvider = await select({
121
+ message: "Planner provider:",
122
+ choices: installedChoices,
123
+ default: disk.planner?.provider ?? installedChoices[0].value,
124
+ });
125
+ const plannerModelChoices = (statuses.find((s) => s.provider.name === plannerProvider)?.provider.getModels() ?? []).map((m) => ({ name: m, value: m }));
126
+ const plannerModel = await select({
127
+ message: "Planner model:",
128
+ choices: plannerModelChoices,
129
+ default: disk.planner?.model ?? plannerModelChoices[0]?.value,
130
+ });
131
+ const reviewerProvider = await select({
132
+ message: "Reviewer provider:",
133
+ choices: installedChoices,
134
+ default: disk.reviewer?.provider ?? installedChoices[0].value,
135
+ });
136
+ if (reviewerProvider === plannerProvider) {
137
+ console.log(chalk.yellow(" note: planner and reviewer use the same provider. Adversarial signal is reduced when both roles share a model lineage."));
138
+ }
139
+ const reviewerModelChoices = (statuses.find((s) => s.provider.name === reviewerProvider)?.provider.getModels() ?? []).map((m) => ({ name: m, value: m }));
140
+ const reviewerModel = await select({
141
+ message: "Reviewer model:",
142
+ choices: reviewerModelChoices,
143
+ default: disk.reviewer?.model ?? reviewerModelChoices[0]?.value,
144
+ });
145
+ const maxRoundsRaw = await input({
146
+ message: "Maximum review rounds:",
147
+ default: String(disk.max_rounds ?? 10),
148
+ validate: (v) => {
149
+ const n = Number(v);
150
+ return Number.isInteger(n) && n >= 1 && n <= 50
151
+ ? true
152
+ : "Enter an integer between 1 and 50.";
153
+ },
154
+ });
155
+ const plansDir = await input({
156
+ message: "Plans directory:",
157
+ default: disk.plans_dir ?? "docs/plans",
158
+ });
159
+ const plannerMode = (await select({
160
+ message: "Planner mode:",
161
+ choices: [
162
+ { name: "inline (you act as the planner)", value: "inline" },
163
+ { name: "external (route revisions through the planner provider)", value: "external" },
164
+ ],
165
+ default: disk.planner_mode ?? "inline",
166
+ }));
167
+ if (reviewerProvider === "gemini") {
168
+ console.log("\n" + chalk.yellow(GEMINI_REVIEWER_INLINE_WARNING) + "\n");
169
+ }
170
+ const answers = {
171
+ plannerProvider,
172
+ plannerModel,
173
+ reviewerProvider,
174
+ reviewerModel,
175
+ maxRounds: Number(maxRoundsRaw),
176
+ plansDir,
177
+ plannerMode,
178
+ };
179
+ const picks = answersToPicks(answers, disk);
180
+ if (picks.length === 0) {
181
+ console.log(chalk.dim("No changes — your planpong.yaml already matches these answers."));
182
+ return;
183
+ }
184
+ console.log(chalk.bold("\nProposed changes:"));
185
+ for (const p of picks) {
186
+ console.log(` ${p.key.padEnd(20)} → ${p.rawValue}`);
187
+ }
188
+ const proceed = await confirm({
189
+ message: existsSync(join(cwd, "planpong.yaml"))
190
+ ? "Update planpong.yaml with these changes?"
191
+ : "Write planpong.yaml in this directory?",
192
+ default: true,
193
+ });
194
+ if (!proceed) {
195
+ console.log(chalk.dim("Cancelled, no changes written."));
196
+ return;
197
+ }
198
+ const result = setConfigValuesBatch(cwd, picks);
199
+ console.log(chalk.green(result.created ? "Created" : "Updated"), result.configPath);
200
+ console.log(formatPostWriteSummary(answers));
201
+ }
202
+ export function registerInitCommand(program) {
203
+ program
204
+ .command("init")
205
+ .description("Interactive setup wizard — produces a working planpong.yaml")
206
+ .action(async () => {
207
+ try {
208
+ await runWizard(process.cwd());
209
+ }
210
+ catch (err) {
211
+ const e = err;
212
+ if (e?.name === "ExitPromptError") {
213
+ console.log(chalk.dim("\nAborted, no changes written."));
214
+ return;
215
+ }
216
+ console.error(chalk.red("Error:"), e?.message ?? String(err));
217
+ process.exitCode = 1;
218
+ }
219
+ });
220
+ }
221
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -11,14 +11,14 @@ export function registerPlanCommand(program) {
11
11
  .description("Generate and review a plan through adversarial refinement")
12
12
  .argument("<requirements>", "Requirements text or path to a .md/.txt file")
13
13
  .option("--name <name>", "Plan filename slug (auto-generated if omitted)")
14
- .option("--planner-provider <provider>", "Planner provider (claude, codex)")
15
- .option("--planner-model <model>", "Planner model override")
16
- .option("--planner-effort <effort>", "Planner effort level")
17
- .option("--reviewer-provider <provider>", "Reviewer provider (claude, codex)")
18
- .option("--reviewer-model <model>", "Reviewer model override")
19
- .option("--reviewer-effort <effort>", "Reviewer effort level")
14
+ .option("--planner-provider <provider>", "Planner provider (claude, codex, gemini)")
15
+ .option("--planner-model <model>", "Planner model override (see 'planpong config providers')")
16
+ .option("--planner-effort <effort>", "Planner effort level (see 'planpong config providers')")
17
+ .option("--reviewer-provider <provider>", "Reviewer provider (claude, codex, gemini)")
18
+ .option("--reviewer-model <model>", "Reviewer model override (see 'planpong config providers')")
19
+ .option("--reviewer-effort <effort>", "Reviewer effort level (see 'planpong config providers')")
20
20
  .option("--plans-dir <dir>", "Plans output directory")
21
- .option("--max-rounds <n>", "Maximum review rounds")
21
+ .option("--max-rounds <n>", "Maximum review rounds (1-50)")
22
22
  .option("--autonomous", "Run without human-in-loop pauses")
23
23
  .action(async (requirementsArg, opts) => {
24
24
  printBanner();