openplanr 1.8.1 → 1.9.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 (56) hide show
  1. package/README.md +38 -20
  2. package/dist/cli/commands/doctor.d.ts +3 -0
  3. package/dist/cli/commands/doctor.d.ts.map +1 -0
  4. package/dist/cli/commands/doctor.js +52 -0
  5. package/dist/cli/commands/doctor.js.map +1 -0
  6. package/dist/cli/commands/init.d.ts.map +1 -1
  7. package/dist/cli/commands/init.js +14 -14
  8. package/dist/cli/commands/init.js.map +1 -1
  9. package/dist/cli/commands/pipeline.d.ts +3 -0
  10. package/dist/cli/commands/pipeline.d.ts.map +1 -0
  11. package/dist/cli/commands/pipeline.js +51 -0
  12. package/dist/cli/commands/pipeline.js.map +1 -0
  13. package/dist/cli/commands/runtime.d.ts +3 -0
  14. package/dist/cli/commands/runtime.d.ts.map +1 -0
  15. package/dist/cli/commands/runtime.js +82 -0
  16. package/dist/cli/commands/runtime.js.map +1 -0
  17. package/dist/cli/commands/setup.d.ts +3 -0
  18. package/dist/cli/commands/setup.d.ts.map +1 -0
  19. package/dist/cli/commands/setup.js +59 -0
  20. package/dist/cli/commands/setup.js.map +1 -0
  21. package/dist/cli/index.js +23 -1
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/generators/codex-generator.d.ts.map +1 -1
  24. package/dist/generators/codex-generator.js +6 -3
  25. package/dist/generators/codex-generator.js.map +1 -1
  26. package/dist/generators/cursor-generator.d.ts +0 -2
  27. package/dist/generators/cursor-generator.d.ts.map +1 -1
  28. package/dist/generators/cursor-generator.js +28 -46
  29. package/dist/generators/cursor-generator.js.map +1 -1
  30. package/dist/services/artifact-service.d.ts.map +1 -1
  31. package/dist/services/artifact-service.js +2 -1
  32. package/dist/services/artifact-service.js.map +1 -1
  33. package/dist/services/atomic-write-service.d.ts.map +1 -1
  34. package/dist/services/atomic-write-service.js +3 -1
  35. package/dist/services/atomic-write-service.js.map +1 -1
  36. package/dist/services/pipeline-package-service.d.ts +9 -0
  37. package/dist/services/pipeline-package-service.d.ts.map +1 -0
  38. package/dist/services/pipeline-package-service.js +45 -0
  39. package/dist/services/pipeline-package-service.js.map +1 -0
  40. package/dist/services/provenance-service.d.ts +13 -0
  41. package/dist/services/provenance-service.d.ts.map +1 -0
  42. package/dist/services/provenance-service.js +48 -0
  43. package/dist/services/provenance-service.js.map +1 -0
  44. package/dist/services/revise-plan-service.js +3 -1
  45. package/dist/services/revise-plan-service.js.map +1 -1
  46. package/dist/services/runtime-manager-service.d.ts +79 -0
  47. package/dist/services/runtime-manager-service.d.ts.map +1 -0
  48. package/dist/services/runtime-manager-service.js +772 -0
  49. package/dist/services/runtime-manager-service.js.map +1 -0
  50. package/dist/services/spec-service.d.ts +4 -3
  51. package/dist/services/spec-service.d.ts.map +1 -1
  52. package/dist/services/spec-service.js +14 -3
  53. package/dist/services/spec-service.js.map +1 -1
  54. package/install.ps1 +35 -0
  55. package/install.sh +48 -0
  56. package/package.json +7 -2
package/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  # OpenPlanr
4
4
 
5
- ### The planning layer for AI coding agents
5
+ ### Dedicated planning CLI and cross-runtime workflow control plane
6
6
 
7
- **Plan once. Ship with agents.** Works natively on **Claude Code**, **Cursor**, and **Codex** via the runtime-agnostic [OpenPlanr Protocol v1.0.0](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol).
7
+ **Plan continuously. Route feature delivery anywhere.** Certified first for **Claude Code**, **Cursor**, and **Codex** through Protocol v1.0 artifacts plus v1.1 runtime contracts.
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/openplanr.svg?style=flat-square&color=cb3837&logo=npm)](https://www.npmjs.com/package/openplanr)
10
10
  [![node](https://img.shields.io/node/v/openplanr.svg?style=flat-square&color=339933&logo=node.js&logoColor=white)](https://nodejs.org)
@@ -12,24 +12,31 @@
12
12
  [![protocol](https://img.shields.io/badge/protocol-v1.0.0-7c3aed?style=flat-square)](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol)
13
13
  [![runtimes](https://img.shields.io/badge/runtimes-Claude%20Code%20%7C%20Cursor%20%7C%20Codex-f97316?style=flat-square)](https://github.com/openplanr/planr-pipeline/blob/main/docs/compatibility-matrix.md)
14
14
 
15
- **[Website](https://openplanr.dev)** · **[Pipeline plugin](https://github.com/openplanr/planr-pipeline)** · **[Compatibility matrix](https://github.com/openplanr/planr-pipeline/blob/main/docs/compatibility-matrix.md)** · **[Protocol spec](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol)** · **[CLI reference](docs/CLI.md)**
15
+ **[Website](https://openplanr.dev)** · **[Setup guide](docs/CROSS_RUNTIME_SETUP.md)** · **[Compatibility matrix](https://github.com/openplanr/planr-pipeline/blob/main/docs/compatibility-matrix.md)** · **[Protocol spec](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol)** · **[CLI reference](docs/CLI.md)**
16
16
 
17
17
  </div>
18
18
 
19
19
  ---
20
20
 
21
- `planr` is a Node CLI that authors structured plans (epics, features, stories, tasks, or full specs) as markdown in your repo, then generates runtime-native rule files so your AI coding agent picks up the plan automatically. One command to install, one command to initialise — your runtime activates the workflow without further setup.
21
+ OpenPlanr is the standalone planning and project-management CLI. It owns epics,
22
+ features, stories, tasks, specs, sprints, backlog, reports, integrations, and
23
+ artifact lifecycle. `planr-pipeline` is a separate complete PO → Design → Review
24
+ → DEV → QA workflow with its own feature-local planning phase. The overlap is
25
+ intentional; shared artifacts and provenance make the producer explicit.
22
26
 
23
27
  ```bash
24
- npm install -g openplanr
28
+ curl -fsSL https://openplanr.dev/install.sh | sh
29
+ # Windows: irm https://openplanr.dev/install.ps1 | iex
30
+
25
31
  cd my-project
32
+ planr setup
33
+ planr doctor
26
34
  planr init
27
- # Created .planr/config.json
28
- # ✓ Generated 17 AI agent rule file(s) (scope: all)
29
- # ✓ Open Cursor / Codex / Claude Code — pipeline workflow is live
35
+ planr pipeline plan auth
30
36
  ```
31
37
 
32
- That's the whole onboarding.
38
+ No global install is also supported: `npx openplanr@latest setup`. Planning-only
39
+ installations use `--minimal`; the full pipeline is the default.
33
40
 
34
41
  ---
35
42
 
@@ -38,9 +45,9 @@ That's the whole onboarding.
38
45
  AI coding agents are powerful but lack structured planning context. Without a clear plan, they generate code that drifts from requirements, churn on the same problem across sessions, and can't be audited. OpenPlanr fixes this with four properties:
39
46
 
40
47
  1. **Markdown artifacts in your repo** — plans live next to your code, version-controlled, gittable, gradable. No external SaaS, no DB.
41
- 2. **One contract, every runtime** — author once; Claude Code, Cursor, and Codex all consume the same artifacts via [OpenPlanr Protocol v1.0.0](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol).
42
- 3. **Three planning postures** — pick the ceremony level that matches the work: agile (epic → feature → story → task), quick task (one-off chores), or spec-driven (handoff to an AI factory).
43
- 4. **Hard rules at the tool layer** — when paired with the [planr-pipeline](https://github.com/openplanr/planr-pipeline) Claude Code plugin, agent tool restrictions are enforced in the manifest, not just the prompt. Production-grade audit trail via the `.pipeline-shipped` execution marker.
48
+ 2. **One contract, every runtime** — Claude Code, Cursor, and Codex consume the same v1.0 artifacts while locks, adapter capabilities, and provenance use additive v1.1 contracts.
49
+ 3. **Three planning postures** — agile, quick task, or spec-driven planning, independent from the pipeline's feature-local PO phase.
50
+ 4. **Safe runtime migration** — setup previews exact changes, preserves hand-written content, records ownership, backs up exact bytes, and supports rollback.
44
51
 
45
52
  ---
46
53
 
@@ -58,13 +65,14 @@ Pick one per project, mix per task. The spec-driven posture is the bridge to the
58
65
 
59
66
  ## Cross-runtime support
60
67
 
61
- `planr init` auto-generates rule files for all three runtimes by default. Each tool is **self-sufficient after a single install**:
68
+ `planr setup` detects installed runtimes and installs portable adapters. `planr init`
69
+ remains project initialization; it is no longer overloaded with user installation.
62
70
 
63
71
  | Runtime | What gets installed | How the workflow activates |
64
72
  |---|---|---|
65
- | **Claude Code** | `CLAUDE.md` + sibling `planr-pipeline.md` reference card. Optional: install the `planr-pipeline` plugin for full manifest-enforced subagents. | `/planr-pipeline:plan {feature}` and `/planr-pipeline:ship {feature}` slash commands |
66
- | **Cursor** | `.cursor/rules/planr-pipeline.mdc` + `agents/{8 role bodies}.md` | User says "plan {feature}" or "ship {feature}" — Composer dispatches the pipeline subagents |
67
- | **Codex** | `AGENTS.md` with `## Planr Pipeline Orchestration` section | User says "plan {feature}" Codex adopts the role personas |
73
+ | **Claude Code** | Portable package with the native plugin commands and tool-enforced agents; existing marketplace installs remain compatible | Existing slash commands or the packaged headless router |
74
+ | **Cursor** | Portable project rules plus nine generated role files using relative paths | Composer handoff with sequential fallback |
75
+ | **Codex** | User-scope skills; `AGENTS.md` contains only project policy and artifact pointers | Skills, native subagents when available, sequential fallback otherwise |
68
76
 
69
77
  Same artifacts (`.planr/specs/SPEC-NNN-{slug}/`). Same `.pipeline-shipped` proof markers. Cross-runtime spec portability works out of the box. See the [compatibility matrix](https://github.com/openplanr/planr-pipeline/blob/main/docs/compatibility-matrix.md) for per-capability parity.
70
78
 
@@ -72,12 +80,17 @@ Same artifacts (`.planr/specs/SPEC-NNN-{slug}/`). Same `.pipeline-shipped` proof
72
80
 
73
81
  ## Quick start
74
82
 
75
- ### Install
83
+ ### Install and setup
76
84
 
77
85
  ```bash
78
- npm install -g openplanr
86
+ curl -fsSL https://openplanr.dev/install.sh | sh
87
+ planr setup --runtime auto --scope both
88
+ planr doctor
79
89
  ```
80
90
 
91
+ Use `planr setup --dry-run` to preview, `planr setup --minimal` for planning
92
+ only, and `planr runtime rollback` to restore exact pre-migration bytes.
93
+
81
94
  ### Initialise a project
82
95
 
83
96
  ```bash
@@ -118,8 +131,9 @@ planr quick create "add OAuth login"
118
131
  ```bash
119
132
  planr spec create "Auth flow" --slug auth
120
133
  planr spec shape SPEC-001 # 4 questions, no $EDITOR
121
- # Then in Claude Code / Cursor / Codex:
122
- # /planr-pipeline:plan auth → human review /planr-pipeline:ship auth
134
+ planr pipeline plan auth
135
+ # Human review is mandatory before the separate SHIP invocation:
136
+ planr pipeline ship auth
123
137
  ```
124
138
 
125
139
  ---
@@ -229,6 +243,10 @@ Output: Markdown + HTML written to `.planr/reports/`. `--push slack` posts via w
229
243
 
230
244
  | Command | Description |
231
245
  |---|---|
246
+ | `planr setup` | Detect and install runtime adapters with preview, backup, and locking |
247
+ | `planr runtime detect/list/install/update/remove/rollback/doctor` | Manage adapter lifecycle |
248
+ | `planr doctor [--strict] [--fix] [--json]` | Unified ecosystem health checks |
249
+ | `planr pipeline <action>` | Route PLAN, Design, SHIP, status, dashboard, sync, or doctor |
232
250
  | `planr init` | Initialise project (creates `.planr/`, generates rules for all runtimes by default) |
233
251
  | `planr config show` | Display current configuration + spec-driven readiness |
234
252
  | `planr config set-provider` / `set-key` / `set-model` / `set-agent` | Manage AI provider settings |
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDoctorCommand(program: Command, cliVersion: string): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QA+CzE"}
@@ -0,0 +1,52 @@
1
+ import { promptConfirm } from '../../services/prompt-service.js';
2
+ import { applySetup, runtimeDoctor } from '../../services/runtime-manager-service.js';
3
+ import { display, logger } from '../../utils/logger.js';
4
+ export function registerDoctorCommand(program, cliVersion) {
5
+ program
6
+ .command('doctor')
7
+ .description('Diagnose OpenPlanr, pipeline, runtime adapter, and project health')
8
+ .option('--strict', 'treat warnings as failures', false)
9
+ .option('--fix', 'preview and repair owned generated files', false)
10
+ .option('--json', 'machine-readable output', false)
11
+ .option('--yes', 'apply owned-file repairs without confirmation', false)
12
+ .action(async (opts) => {
13
+ const projectDir = program.opts().projectDir;
14
+ let result = await runtimeDoctor(projectDir);
15
+ if (opts.fix) {
16
+ const preview = await applySetup({
17
+ projectDir,
18
+ cliVersion,
19
+ runtime: 'auto',
20
+ scope: 'both',
21
+ dryRun: true,
22
+ });
23
+ if (!opts.json) {
24
+ logger.heading('Repair preview');
25
+ for (const action of preview.actions.filter((item) => item.operation !== 'unchanged')) {
26
+ display.bullet(`${action.operation} ${action.target}`);
27
+ }
28
+ }
29
+ const confirmed = opts.yes ||
30
+ program.opts().yes ||
31
+ (await promptConfirm('Apply owned-file repairs?', true));
32
+ if (confirmed) {
33
+ await applySetup({ projectDir, cliVersion, runtime: 'auto', scope: 'both' });
34
+ result = await runtimeDoctor(projectDir);
35
+ }
36
+ }
37
+ if (opts.json)
38
+ display.line(JSON.stringify(result));
39
+ else {
40
+ logger.heading('OpenPlanr doctor');
41
+ for (const diagnostic of result.diagnostics) {
42
+ const label = diagnostic.status === 'pass' ? 'PASS' : diagnostic.status === 'warn' ? 'WARN' : 'FAIL';
43
+ display.line(` ${label.padEnd(4)} ${diagnostic.code}: ${diagnostic.message}`);
44
+ if (diagnostic.fix)
45
+ display.line(` Fix: ${diagnostic.fix}`);
46
+ }
47
+ }
48
+ if (!result.ok || (opts.strict && result.diagnostics.some((item) => item.status === 'warn')))
49
+ process.exitCode = 1;
50
+ });
51
+ }
52
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA2LnD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAsLnD"}
@@ -13,15 +13,16 @@ import { resolveApiKeySource, saveCredential } from '../../services/credentials-
13
13
  import { promptConfirm, promptSecret, promptSelect, promptText, } from '../../services/prompt-service.js';
14
14
  import { renderTemplate } from '../../services/template-service.js';
15
15
  import { ARTIFACT_DIRS, CONFIG_FILENAME } from '../../utils/constants.js';
16
- import { ensureDir, fileExists, writeFile } from '../../utils/fs.js';
16
+ import { ensureDir, fileExists, readFile, writeFile } from '../../utils/fs.js';
17
17
  import { logger } from '../../utils/logger.js';
18
+ import { spliceManagedBlock } from '../../utils/splice-managed-block.js';
18
19
  export function registerInitCommand(program) {
19
20
  program
20
21
  .command('init')
21
22
  .description('Initialize Planr in the current project')
22
23
  .option('--name <name>', 'project name')
23
24
  .option('--no-ai', 'skip AI setup')
24
- .option('--no-pipeline-rules', 'skip planr-pipeline rules (generates agile rules only — equivalent to running `planr rules generate --scope agile` post-init)')
25
+ .option('--no-pipeline-rules', 'deprecated compatibility flag; runtime installation belongs to `planr setup`', false)
25
26
  .action(async (opts) => {
26
27
  const projectDir = program.opts().projectDir;
27
28
  const configPath = path.join(projectDir, CONFIG_FILENAME);
@@ -105,14 +106,9 @@ export function registerInitCommand(program) {
105
106
  await writeFile(estimationPath, estimationContent);
106
107
  logger.success('Created estimation guide');
107
108
  }
108
- // Decide rule scope: agile (default agile workflow rules) or all (agile +
109
- // planr-pipeline rules so Cursor/Codex/Claude pick up the spec-driven
110
- // workflow automatically). Interactive default is `true` to give every new
111
- // project a complete cross-runtime experience without an extra command.
112
- const includePipelineRules = opts.pipelineRules === false
113
- ? false
114
- : await promptConfirm('Generate planr-pipeline rules (auto-activates spec-driven workflow in Cursor and Codex)?', true);
115
- const ruleScope = includePipelineRules ? 'all' : 'agile';
109
+ // Project initialization writes planning context only. User/runtime
110
+ // installation and pipeline migration belong to `planr setup`.
111
+ const ruleScope = 'agile';
116
112
  // Generate AI agent rules
117
113
  const generators = createGenerators(config, projectDir);
118
114
  let ruleFiles = 0;
@@ -127,7 +123,13 @@ export function registerInitCommand(program) {
127
123
  for (const file of files) {
128
124
  const fullPath = path.join(projectDir, file.path);
129
125
  await ensureDir(path.dirname(fullPath));
130
- await writeFile(fullPath, file.content);
126
+ if (file.markerName) {
127
+ const existing = (await fileExists(fullPath)) ? await readFile(fullPath) : '';
128
+ await writeFile(fullPath, spliceManagedBlock(existing, file.markerName, file.content));
129
+ }
130
+ else {
131
+ await writeFile(fullPath, file.content);
132
+ }
131
133
  ruleFiles++;
132
134
  }
133
135
  }
@@ -156,9 +158,7 @@ export function registerInitCommand(program) {
156
158
  }
157
159
  logger.dim(' planr epic create — Create your first epic');
158
160
  logger.dim(' planr quick "description" — Quick standalone task list (no agile ceremony)');
159
- if (includePipelineRules) {
160
- logger.dim(' planr spec create — Author a spec for the planr-pipeline workflow');
161
- }
161
+ logger.dim(' planr setup — Install or migrate runtime workflow adapters');
162
162
  logger.dim(' planr rules generate — Regenerate AI agent rules after changes');
163
163
  logger.dim(' planr config show — View configuration');
164
164
  });
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerPipelineCommand(program: Command): void;
3
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA2BvD"}
@@ -0,0 +1,51 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { resolvePipelinePackage } from '../../services/pipeline-package-service.js';
3
+ const ACTIONS = [
4
+ 'plan',
5
+ 'design',
6
+ 'design-loop',
7
+ 'design-review',
8
+ 'ship',
9
+ 'status',
10
+ 'dashboard',
11
+ 'sync',
12
+ 'doctor',
13
+ ];
14
+ export function registerPipelineCommand(program) {
15
+ program
16
+ .command('pipeline <action> [feature]')
17
+ .description('Route the complete PO, Design, DEV, and QA pipeline')
18
+ .option('--runtime <runtime>', 'auto, claude, codex, or cursor')
19
+ .option('--json', 'machine-readable output', false)
20
+ .option('--no-launch', 'return a runtime handoff instead of launching')
21
+ .option('--port <port>', 'dashboard port')
22
+ .option('--no-watch', 'disable dashboard file watching')
23
+ .action((action, feature, opts) => {
24
+ if (!ACTIONS.includes(action))
25
+ throw new Error(`Unknown pipeline action: ${action}`);
26
+ const pipeline = resolvePipelinePackage();
27
+ if (!pipeline)
28
+ throw new Error('E_PIPELINE_NOT_INSTALLED');
29
+ const args = [pipeline.binPath, action];
30
+ if (feature)
31
+ args.push(feature);
32
+ if (opts.runtime && opts.runtime !== 'auto')
33
+ args.push('--runtime', opts.runtime);
34
+ if (opts.json)
35
+ args.push('--json');
36
+ if (opts.launch === false)
37
+ args.push('--no-launch');
38
+ if (opts.port)
39
+ args.push('--port', String(opts.port));
40
+ if (opts.watch === false)
41
+ args.push('--no-watch');
42
+ const result = spawnSync(process.execPath, args, {
43
+ cwd: program.opts().projectDir,
44
+ stdio: 'inherit',
45
+ });
46
+ if (result.error)
47
+ throw result.error;
48
+ process.exitCode = result.status ?? 1;
49
+ });
50
+ }
51
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/cli/commands/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAEpF,MAAM,OAAO,GAAG;IACd,MAAM;IACN,QAAQ;IACR,aAAa;IACb,eAAe;IACf,MAAM;IACN,QAAQ;IACR,WAAW;IACX,MAAM;IACN,QAAQ;CACT,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,6BAA6B,CAAC;SACtC,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,yBAAyB,EAAE,KAAK,CAAC;SAClD,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,YAAY,EAAE,iCAAiC,CAAC;SACvD,MAAM,CAAC,CAAC,MAAc,EAAE,OAA2B,EAAE,IAAI,EAAE,EAAE;QAC5D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClF,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE;YAC/C,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,UAAoB;YACxC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK;YAAE,MAAM,MAAM,CAAC,KAAK,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerRuntimeCommand(program: Command, cliVersion: string): void;
3
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QA8E1E"}
@@ -0,0 +1,82 @@
1
+ import { promptConfirm } from '../../services/prompt-service.js';
2
+ import { applySetup, detectRuntimes, listRuntimeAdapters, removeRuntime, rollbackRuntime, runtimeDoctor, } from '../../services/runtime-manager-service.js';
3
+ import { display } from '../../utils/logger.js';
4
+ function print(value, json) {
5
+ if (json)
6
+ display.line(JSON.stringify(value));
7
+ else
8
+ display.line(JSON.stringify(value, null, 2));
9
+ }
10
+ export function registerRuntimeCommand(program, cliVersion) {
11
+ const runtime = program.command('runtime').description('Manage runtime adapters');
12
+ runtime
13
+ .command('detect')
14
+ .option('--json', 'machine-readable output', false)
15
+ .action((opts) => print({ ok: true, runtimes: detectRuntimes() }, opts.json));
16
+ runtime
17
+ .command('list')
18
+ .option('--json', 'machine-readable output', false)
19
+ .action((opts) => print({ ok: true, adapters: listRuntimeAdapters(), detected: detectRuntimes() }, opts.json));
20
+ for (const operation of ['install', 'update']) {
21
+ runtime
22
+ .command(`${operation} <runtime>`)
23
+ .option('--scope <scope>', 'user, project, or both', 'both')
24
+ .option('--version <version>', 'adapter version')
25
+ .option('--dry-run', 'preview without writing', false)
26
+ .option('--yes', 'apply without confirmation', false)
27
+ .option('--json', 'machine-readable output', false)
28
+ .action(async (runtimeId, opts) => {
29
+ const projectDir = program.opts().projectDir;
30
+ const options = {
31
+ projectDir,
32
+ cliVersion,
33
+ runtime: runtimeId,
34
+ scope: opts.scope,
35
+ version: opts.version,
36
+ dryRun: Boolean(opts.dryRun),
37
+ merge: true,
38
+ };
39
+ if (!opts.dryRun && !opts.yes && !program.opts().yes) {
40
+ const ok = await promptConfirm(`${operation} the ${runtimeId} adapter?`, true);
41
+ if (!ok)
42
+ return;
43
+ }
44
+ print(await applySetup(options), opts.json);
45
+ });
46
+ }
47
+ runtime
48
+ .command('remove <runtime>')
49
+ .option('--yes', 'remove without confirmation', false)
50
+ .option('--json', 'machine-readable output', false)
51
+ .action(async (runtimeId, opts) => {
52
+ if (!opts.yes && !program.opts().yes) {
53
+ const ok = await promptConfirm(`Remove OpenPlanr-owned ${runtimeId} adapter files?`, false);
54
+ if (!ok)
55
+ return;
56
+ }
57
+ print(await removeRuntime(runtimeId, program.opts().projectDir), opts.json);
58
+ });
59
+ runtime
60
+ .command('rollback')
61
+ .option('--backup <path>', 'specific backup directory')
62
+ .option('--yes', 'restore without confirmation', false)
63
+ .option('--json', 'machine-readable output', false)
64
+ .action(async (opts) => {
65
+ if (!opts.yes && !program.opts().yes) {
66
+ const ok = await promptConfirm('Restore the exact pre-setup bytes from backup?', false);
67
+ if (!ok)
68
+ return;
69
+ }
70
+ print(await rollbackRuntime(program.opts().projectDir, opts.backup), opts.json);
71
+ });
72
+ runtime
73
+ .command('doctor')
74
+ .option('--json', 'machine-readable output', false)
75
+ .action(async (opts) => {
76
+ const result = await runtimeDoctor(program.opts().projectDir);
77
+ print(result, opts.json);
78
+ if (!result.ok)
79
+ process.exitCode = 1;
80
+ });
81
+ }
82
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/cli/commands/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSetupCommand(program: Command, cliVersion: string): void;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,QAkDxE"}
@@ -0,0 +1,59 @@
1
+ import { promptConfirm } from '../../services/prompt-service.js';
2
+ import { applySetup, previewSetup, } from '../../services/runtime-manager-service.js';
3
+ import { display, logger } from '../../utils/logger.js';
4
+ export function registerSetupCommand(program, cliVersion) {
5
+ program
6
+ .command('setup')
7
+ .description('Detect runtimes and install or migrate OpenPlanr runtime adapters')
8
+ .option('--runtime <runtime>', 'auto, claude, codex, cursor, or all', 'auto')
9
+ .option('--scope <scope>', 'user, project, or both', 'both')
10
+ .option('--minimal', 'planning-only setup; do not install the pipeline', false)
11
+ .option('--version <version>', 'pin the pipeline and adapter version')
12
+ .option('--dry-run', 'preview exact changes without writing', false)
13
+ .option('--yes', 'apply without an interactive confirmation', false)
14
+ .option('--json', 'emit machine-readable output', false)
15
+ .action(async (opts) => {
16
+ const projectDir = program.opts().projectDir;
17
+ const options = {
18
+ projectDir,
19
+ cliVersion,
20
+ runtime: opts.runtime,
21
+ scope: opts.scope,
22
+ minimal: Boolean(opts.minimal),
23
+ version: opts.version,
24
+ dryRun: Boolean(opts.dryRun),
25
+ };
26
+ const preview = await previewSetup(options);
27
+ if (opts.json) {
28
+ if (opts.dryRun) {
29
+ display.line(JSON.stringify(preview));
30
+ return;
31
+ }
32
+ }
33
+ else {
34
+ logger.heading('OpenPlanr setup preview');
35
+ display.keyValue('Runtimes', preview.runtimes.join(', ') || 'planning only');
36
+ display.keyValue('Scope', preview.scope);
37
+ display.keyValue('Pipeline', preview.pipelineVersion ?? 'omitted');
38
+ for (const action of preview.actions) {
39
+ display.bullet(`${action.operation.padEnd(9)} ${action.target}`);
40
+ }
41
+ }
42
+ if (opts.dryRun)
43
+ return;
44
+ const confirmed = opts.yes || program.opts().yes || (await promptConfirm('Apply these changes?', true));
45
+ if (!confirmed) {
46
+ if (opts.json)
47
+ display.line(JSON.stringify({ ok: false, action: 'cancelled' }));
48
+ else
49
+ logger.warn('Setup cancelled; no files were changed.');
50
+ return;
51
+ }
52
+ const result = await applySetup(options);
53
+ if (opts.json)
54
+ display.line(JSON.stringify(result));
55
+ else
56
+ logger.success(`Setup complete${result.backupDir ? `; backup: ${result.backupDir}` : ''}.`);
57
+ });
58
+ }
59
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -4,11 +4,13 @@ import { fileURLToPath } from 'node:url';
4
4
  import { Command } from 'commander';
5
5
  import { ConfigNotFoundError, findProjectRoot } from '../services/config-service.js';
6
6
  import { setNonInteractive } from '../services/interactive-state.js';
7
+ import { RuntimeManagerError } from '../services/runtime-manager-service.js';
7
8
  import { display, logger, setVerbose } from '../utils/logger.js';
8
9
  import { registerBacklogCommand } from './commands/backlog.js';
9
10
  import { registerChecklistCommand } from './commands/checklist.js';
10
11
  import { registerConfigCommand } from './commands/config.js';
11
12
  import { registerContextCommand } from './commands/context.js';
13
+ import { registerDoctorCommand } from './commands/doctor.js';
12
14
  import { registerEpicCommand } from './commands/epic.js';
13
15
  import { registerEstimateCommand } from './commands/estimate.js';
14
16
  import { registerExportCommand } from './commands/export.js';
@@ -17,6 +19,7 @@ import { registerGitHubCommand } from './commands/github.js';
17
19
  import { registerGraphCommand } from './commands/graph.js';
18
20
  import { registerInitCommand } from './commands/init.js';
19
21
  import { registerLinearCommand } from './commands/linear.js';
22
+ import { registerPipelineCommand } from './commands/pipeline.js';
20
23
  import { registerPlanCommand } from './commands/plan.js';
21
24
  import { registerQuickCommand } from './commands/quick.js';
22
25
  import { registerRefineCommand } from './commands/refine.js';
@@ -24,7 +27,9 @@ import { registerReportCommand } from './commands/report.js';
24
27
  import { registerReportLinterCommand } from './commands/report-linter.js';
25
28
  import { registerReviseCommand } from './commands/revise.js';
26
29
  import { registerRulesCommand } from './commands/rules.js';
30
+ import { registerRuntimeCommand } from './commands/runtime.js';
27
31
  import { registerSearchCommand } from './commands/search.js';
32
+ import { registerSetupCommand } from './commands/setup.js';
28
33
  import { registerSpecCommand } from './commands/spec.js';
29
34
  import { registerSprintCommand } from './commands/sprint.js';
30
35
  import { registerStatusCommand } from './commands/status.js';
@@ -51,7 +56,7 @@ const version = readVersion();
51
56
  const program = new Command();
52
57
  program
53
58
  .name('planr')
54
- .description('AI-powered planning CLI — backlog, sprints, tasks, estimation, and AI agent rules')
59
+ .description('OpenPlanr planning CLI and cross-runtime pipeline router')
55
60
  .version(version)
56
61
  .option('--project-dir <path>', 'project root directory', findProjectRoot())
57
62
  .option('--verbose', 'verbose output', false)
@@ -66,6 +71,10 @@ program.hook('preAction', () => {
66
71
  }
67
72
  });
68
73
  registerInitCommand(program);
74
+ registerSetupCommand(program, version);
75
+ registerDoctorCommand(program, version);
76
+ registerRuntimeCommand(program, version);
77
+ registerPipelineCommand(program);
69
78
  registerLinearCommand(program);
70
79
  registerBacklogCommand(program);
71
80
  registerEpicCommand(program);
@@ -103,6 +112,19 @@ program.parseAsync(process.argv).catch((err) => {
103
112
  display.line('');
104
113
  process.exit(1);
105
114
  }
115
+ if (err instanceof RuntimeManagerError || String(err?.name).startsWith('E_')) {
116
+ const value = err instanceof RuntimeManagerError
117
+ ? err.toJSON()
118
+ : { ok: false, code: err.name, problem: err.message };
119
+ if (process.argv.includes('--json'))
120
+ display.line(JSON.stringify(value));
121
+ else {
122
+ logger.error(`${value.code}: ${value.problem}`);
123
+ if ('recovery' in value && value.recovery)
124
+ display.line(` ${value.recovery}`);
125
+ }
126
+ process.exit(1);
127
+ }
106
128
  throw err;
107
129
  });
108
130
  //# sourceMappingURL=index.js.map