@chriskealley/openroad 0.1.0 → 0.1.2
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 +5 -1
- package/dist/src/installer.js +19 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -48,7 +48,7 @@ If npm reports a permissions error during global installation, configure an npm-
|
|
|
48
48
|
|
|
49
49
|
## What installation changes
|
|
50
50
|
|
|
51
|
-
If `--tools` is omitted, the CLI detects existing `.
|
|
51
|
+
If `--tools` is omitted, the CLI detects existing `.agents`, `.pi`, `.claude`, and `.cursor` directories. Codex uses the shared `.agents/skills` location. It then:
|
|
52
52
|
|
|
53
53
|
- Creates `openspec/roadmap.md` if it does not already exist.
|
|
54
54
|
- Installs the `openroad` and `openroad-next` skills for each selected tool.
|
|
@@ -76,6 +76,8 @@ Lifecycle statuses are `planned`, `ready`, `active`, `done`, and `cancelled`. On
|
|
|
76
76
|
|
|
77
77
|
The CLI is TypeScript compiled to ES modules. Node.js 22 or later is required to build and test; the repository has one runtime dependency (`yaml`) and no build tooling beyond `tsc`.
|
|
78
78
|
|
|
79
|
+
This repository uses OpenSpec for user-visible behavior and workflow changes. Start a change with the installed OpenSpec workflow, keep its artifacts under `openspec/changes/`, and archive it after implementation and validation. Small maintenance changes that do not alter behavior may remain lightweight.
|
|
80
|
+
|
|
79
81
|
```sh
|
|
80
82
|
git clone https://github.com/chriskealley/openroad.git
|
|
81
83
|
cd openroad
|
|
@@ -89,6 +91,8 @@ npm test
|
|
|
89
91
|
| `npm test` | Build, then run the suite with the Node test runner |
|
|
90
92
|
| `npm run typecheck` | Type-check without emitting output |
|
|
91
93
|
|
|
94
|
+
OpenSpec project context and artifact rules live in `openspec/config.yaml`. Generated Codex workflow skills live in `.agents/skills/` and should be refreshed with `openspec update` after upgrading OpenSpec.
|
|
95
|
+
|
|
92
96
|
Sources live in [src/](src/); `cli.ts` handles argument parsing, `installer.ts` manages the managed-file lifecycle and `.openroad.json` manifest, `config.ts` merges and removes the OpenSpec `config.yaml` guidance, and `roadmap.ts` parses and validates `roadmap.md`. The roadmap template shipped to new projects is [templates/roadmap.md](templates/roadmap.md), and the agent skills are in [skills/](skills/).
|
|
93
97
|
|
|
94
98
|
Two behaviours are worth preserving when changing the installer or parser, and both are covered by tests: installing and removing must leave an existing `openspec/config.yaml` byte-identical, and the shipped roadmap template must validate cleanly under `openroad doctor`.
|
package/dist/src/installer.js
CHANGED
|
@@ -4,11 +4,15 @@ import { fileURLToPath } from "node:url";
|
|
|
4
4
|
import { mergeConfig, removeConfig } from "./config.js";
|
|
5
5
|
import { MANIFEST_NAME } from "./types.js";
|
|
6
6
|
const CONSUMER_DIRS = {
|
|
7
|
-
codex: ".
|
|
7
|
+
codex: ".agents/skills",
|
|
8
8
|
pi: ".pi/skills",
|
|
9
9
|
claude: ".claude/skills",
|
|
10
10
|
cursor: ".cursor/skills"
|
|
11
11
|
};
|
|
12
|
+
const LEGACY_CODEX_SKILLS = new Set([
|
|
13
|
+
".codex/skills/openroad/SKILL.md",
|
|
14
|
+
".codex/skills/openroad-next/SKILL.md"
|
|
15
|
+
]);
|
|
12
16
|
async function exists(path) { try {
|
|
13
17
|
await access(path);
|
|
14
18
|
return true;
|
|
@@ -22,6 +26,9 @@ const ROADMAP_FILE = "openspec/roadmap.md";
|
|
|
22
26
|
function manifestPath(root, target) {
|
|
23
27
|
return relative(root, target).split(sep).join("/");
|
|
24
28
|
}
|
|
29
|
+
function toPosix(file) {
|
|
30
|
+
return file.split("\\").join("/");
|
|
31
|
+
}
|
|
25
32
|
// Exported for tests: the guard that keeps remove() from deleting the roadmap.
|
|
26
33
|
export function isRoadmapEntry(file) {
|
|
27
34
|
return file.split("\\").join("/") === ROADMAP_FILE;
|
|
@@ -67,6 +74,17 @@ export async function install(root, requested) {
|
|
|
67
74
|
await copyFile(join(assetRoot(), "skills", skill, "SKILL.md"), destination);
|
|
68
75
|
files.add(manifestPath(root, destination));
|
|
69
76
|
}
|
|
77
|
+
// Current Codex discovers project skills through .agents/skills. Remove only
|
|
78
|
+
// legacy files that an earlier OpenRoad manifest explicitly claimed, and do
|
|
79
|
+
// so only after their current replacements have been written successfully.
|
|
80
|
+
for (const file of prior?.files ?? []) {
|
|
81
|
+
const normalized = toPosix(file);
|
|
82
|
+
if (!LEGACY_CODEX_SKILLS.has(normalized))
|
|
83
|
+
continue;
|
|
84
|
+
await rm(join(root, ...normalized.split("/")), { force: true });
|
|
85
|
+
files.delete(file);
|
|
86
|
+
files.delete(normalized);
|
|
87
|
+
}
|
|
70
88
|
await mergeConfig(config);
|
|
71
89
|
const manifest = { schemaVersion: 1, packageVersion: await packageVersion(), installedAt: prior?.installedAt ?? new Date().toISOString(), consumers, files: [...files].sort() };
|
|
72
90
|
await writeFile(join(root, MANIFEST_NAME), JSON.stringify(manifest, null, 2) + "\n");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chriskealley/openroad",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "A roadmap companion for OpenSpec projects",
|
|
5
5
|
"author": "Chris Kealley",
|
|
6
6
|
"type": "module",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"engines": { "node": ">=22" },
|
|
25
25
|
"dependencies": { "yaml": "^2.8.1" },
|
|
26
26
|
"devDependencies": {
|
|
27
|
+
"@fission-ai/openspec": "1.13.1",
|
|
27
28
|
"@types/node": "^24.3.0",
|
|
28
29
|
"typescript": "^5.9.2"
|
|
29
30
|
},
|