openplanr 1.8.0 → 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.
- package/README.md +38 -20
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +52 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +14 -14
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/pipeline.d.ts +3 -0
- package/dist/cli/commands/pipeline.d.ts.map +1 -0
- package/dist/cli/commands/pipeline.js +51 -0
- package/dist/cli/commands/pipeline.js.map +1 -0
- package/dist/cli/commands/runtime.d.ts +3 -0
- package/dist/cli/commands/runtime.d.ts.map +1 -0
- package/dist/cli/commands/runtime.js +82 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +3 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +59 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.js +23 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/codex-generator.d.ts.map +1 -1
- package/dist/generators/codex-generator.js +6 -3
- package/dist/generators/codex-generator.js.map +1 -1
- package/dist/generators/cursor-generator.d.ts +0 -2
- package/dist/generators/cursor-generator.d.ts.map +1 -1
- package/dist/generators/cursor-generator.js +28 -46
- package/dist/generators/cursor-generator.js.map +1 -1
- package/dist/services/artifact-service.d.ts.map +1 -1
- package/dist/services/artifact-service.js +2 -1
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/atomic-write-service.d.ts.map +1 -1
- package/dist/services/atomic-write-service.js +3 -1
- package/dist/services/atomic-write-service.js.map +1 -1
- package/dist/services/pipeline-package-service.d.ts +9 -0
- package/dist/services/pipeline-package-service.d.ts.map +1 -0
- package/dist/services/pipeline-package-service.js +45 -0
- package/dist/services/pipeline-package-service.js.map +1 -0
- package/dist/services/provenance-service.d.ts +13 -0
- package/dist/services/provenance-service.d.ts.map +1 -0
- package/dist/services/provenance-service.js +48 -0
- package/dist/services/provenance-service.js.map +1 -0
- package/dist/services/revise-plan-service.js +3 -1
- package/dist/services/revise-plan-service.js.map +1 -1
- package/dist/services/runtime-manager-service.d.ts +79 -0
- package/dist/services/runtime-manager-service.d.ts.map +1 -0
- package/dist/services/runtime-manager-service.js +772 -0
- package/dist/services/runtime-manager-service.js.map +1 -0
- package/dist/services/spec-service.d.ts +4 -3
- package/dist/services/spec-service.d.ts.map +1 -1
- package/dist/services/spec-service.js +14 -3
- package/dist/services/spec-service.js.map +1 -1
- package/dist/templates/rules/codex/_pipeline-section.md.hbs +1 -1
- package/dist/templates/rules/cursor/agents/designer-agent.md +1 -1
- package/dist/templates/rules/cursor/agents/qa-agent.md +1 -1
- package/dist/templates/rules/cursor/agents/specification-agent.md +1 -1
- package/dist/templates/rules/cursor/planr-pipeline.mdc.hbs +1 -1
- package/install.ps1 +35 -0
- package/install.sh +48 -0
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# OpenPlanr
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Dedicated planning CLI and cross-runtime workflow control plane
|
|
6
6
|
|
|
7
|
-
**Plan
|
|
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
|
[](https://www.npmjs.com/package/openplanr)
|
|
10
10
|
[](https://nodejs.org)
|
|
@@ -12,24 +12,31 @@
|
|
|
12
12
|
[](https://github.com/openplanr/planr-pipeline/tree/main/docs/protocol)
|
|
13
13
|
[](https://github.com/openplanr/planr-pipeline/blob/main/docs/compatibility-matrix.md)
|
|
14
14
|
|
|
15
|
-
**[Website](https://openplanr.dev)** · **[
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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** —
|
|
42
|
-
3. **Three planning postures** —
|
|
43
|
-
4. **
|
|
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
|
|
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** |
|
|
66
|
-
| **Cursor** |
|
|
67
|
-
| **Codex** | `AGENTS.md`
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
#
|
|
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 @@
|
|
|
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;
|
|
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', '
|
|
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
|
-
//
|
|
109
|
-
//
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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('
|
|
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
|