@goodtek/vibeops 3.3.0 → 3.3.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.
- package/CHANGELOG.md +6 -0
- package/README.md +3 -3
- package/dist/cli.js +2 -2
- package/dist/commands/init.js +2 -2
- package/dist/lib/init-clients.js +14 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@ All notable changes to VibeOps are documented here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 3.3.1 - 2026-10-18
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **`init` lists the coding agents as Claude Code, Codex CLI, Cursor** (was Cursor, Claude Code, Codex) — in the prompt, the `init` / `--clients` help, the `--clients` error messages and the README. Cursor stays the pre-checked default. The selection keeps the prompt order, so an interactive init now writes `.vibeops.json` `clients` in that order (e.g. `["claude", "cursor"]`) and lists the shared-skill lines of the install report in it (installed files unchanged); `--clients` keeps the order typed (TASK-054).
|
|
12
|
+
|
|
7
13
|
## 3.3.0 - 2026-10-18
|
|
8
14
|
|
|
9
15
|
### Added
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# VibeOps
|
|
2
2
|
|
|
3
|
-
> Minimal CLI rails for TASK-driven vibe coding (
|
|
3
|
+
> Minimal CLI rails for TASK-driven vibe coding (Claude Code, Codex, Cursor).
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@goodtek/vibeops)
|
|
6
6
|
[](LICENSE)
|
|
@@ -59,7 +59,7 @@ Interactive init asks which agents to install, Git branch policy, then **where t
|
|
|
59
59
|
vibeops init
|
|
60
60
|
|
|
61
61
|
# Non-interactive (GitFlow: develop + main, origin required unless CI)
|
|
62
|
-
vibeops init --clients
|
|
62
|
+
vibeops init --clients claude,codex,cursor --git --initial-commit --git-policy gitflow --allow-no-remote
|
|
63
63
|
|
|
64
64
|
# Re-init templates on an existing project
|
|
65
65
|
vibeops init --clients cursor --yes
|
|
@@ -68,9 +68,9 @@ vibeops init --clients cursor --yes
|
|
|
68
68
|
| Pack | Installed |
|
|
69
69
|
|------|-----------|
|
|
70
70
|
| **core** (always) | `AGENTS.md`, `docs/tasks`, `docs/project`, `docs/logs` |
|
|
71
|
-
| **cursor** | `.cursor/rules/`, `.cursor/skills/` |
|
|
72
71
|
| **claude** | `CLAUDE.md`, `.claude/skills/` |
|
|
73
72
|
| **codex** | `.agents/skills/` |
|
|
73
|
+
| **cursor** | `.cursor/rules/`, `.cursor/skills/` |
|
|
74
74
|
|
|
75
75
|
Re-init **overwrites** templates (rules, skills, doc stubs). **`docs/tasks/TASK-*.md` are kept.**
|
|
76
76
|
|
package/dist/cli.js
CHANGED
|
@@ -24,13 +24,13 @@ program.hook("preAction", async (_thisCommand, actionCommand) => {
|
|
|
24
24
|
});
|
|
25
25
|
program
|
|
26
26
|
.command("init")
|
|
27
|
-
.description("Install core + agent client packs (
|
|
27
|
+
.description("Install core + agent client packs (claude, codex, cursor)")
|
|
28
28
|
.option("--dry-run", "Show what would be created")
|
|
29
29
|
.option("--force", "Overwrite existing template files (also implied when re-initializing with --yes)")
|
|
30
30
|
.option("--yes", "Re-init an existing project without prompting")
|
|
31
31
|
.option("--cwd <path>", "Target directory")
|
|
32
32
|
.option("--name <projectName>", "Project name in .vibeops.json")
|
|
33
|
-
.option("--clients <list>", "Agent packs: comma-separated
|
|
33
|
+
.option("--clients <list>", "Agent packs: comma-separated claude, codex, cursor (required in non-interactive mode)")
|
|
34
34
|
.option("--git", "Initialize Git (always on; flag kept for scripts)")
|
|
35
35
|
.option("--initial-commit", "Create initial commit")
|
|
36
36
|
.option("--no-initial-commit", "Skip initial commit")
|
package/dist/commands/init.js
CHANGED
|
@@ -59,7 +59,7 @@ async function confirmReinitIfNeeded(projectRoot, options) {
|
|
|
59
59
|
async function resolveClients(options, interactive) {
|
|
60
60
|
const fromFlag = parseClientsArg(options.clients);
|
|
61
61
|
if (options.clients !== undefined && fromFlag === null) {
|
|
62
|
-
log.error('Invalid --clients. Use comma-separated:
|
|
62
|
+
log.error('Invalid --clients. Use comma-separated: claude, codex, cursor (e.g. --clients claude,cursor)');
|
|
63
63
|
process.exitCode = 1;
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
@@ -73,7 +73,7 @@ async function resolveClients(options, interactive) {
|
|
|
73
73
|
if (options.dryRun) {
|
|
74
74
|
return ["cursor"];
|
|
75
75
|
}
|
|
76
|
-
log.error("Select at least one agent: --clients
|
|
76
|
+
log.error("Select at least one agent: --clients claude,codex,cursor (non-interactive mode).");
|
|
77
77
|
process.exitCode = 1;
|
|
78
78
|
return null;
|
|
79
79
|
}
|
package/dist/lib/init-clients.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { checkbox } from "@inquirer/prompts";
|
|
2
|
-
|
|
2
|
+
/** Display order of the `init` agent prompt (and so of the selection it returns). */
|
|
3
|
+
export const VIBEOPS_CLIENT_IDS = ["claude", "codex", "cursor"];
|
|
3
4
|
export const CLIENT_LABELS = {
|
|
4
|
-
cursor: "Cursor (.cursor/rules, .cursor/skills)",
|
|
5
5
|
claude: "Claude Code (CLAUDE.md, .claude/skills)",
|
|
6
6
|
codex: "Codex CLI (.agents/skills)",
|
|
7
|
+
cursor: "Cursor (.cursor/rules, .cursor/skills)",
|
|
7
8
|
};
|
|
8
9
|
/** Relative skill root per client (under project root). */
|
|
9
10
|
export const CLIENT_SKILL_ROOT = {
|
|
10
|
-
cursor: ".cursor/skills",
|
|
11
11
|
claude: ".claude/skills",
|
|
12
12
|
codex: ".agents/skills",
|
|
13
|
+
cursor: ".cursor/skills",
|
|
13
14
|
};
|
|
14
15
|
export function parseClientsArg(raw) {
|
|
15
16
|
if (raw === undefined || raw.trim().length === 0)
|
|
@@ -37,16 +38,20 @@ function parseOneClient(token) {
|
|
|
37
38
|
export function isVibeopsClientId(value) {
|
|
38
39
|
return VIBEOPS_CLIENT_IDS.includes(value);
|
|
39
40
|
}
|
|
41
|
+
/** Choices of the `init` agent prompt, in `VIBEOPS_CLIENT_IDS` order; Cursor is pre-checked. */
|
|
42
|
+
export function initClientChoices() {
|
|
43
|
+
return VIBEOPS_CLIENT_IDS.map((id) => ({
|
|
44
|
+
name: CLIENT_LABELS[id],
|
|
45
|
+
value: id,
|
|
46
|
+
checked: id === "cursor",
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
40
49
|
export async function askInitClients() {
|
|
41
50
|
const selected = await checkbox({
|
|
42
51
|
message: "Which coding agents will you use? (Space toggle · Enter confirm)",
|
|
43
|
-
choices:
|
|
44
|
-
name: CLIENT_LABELS[id],
|
|
45
|
-
value: id,
|
|
46
|
-
checked: id === "cursor",
|
|
47
|
-
})),
|
|
52
|
+
choices: initClientChoices(),
|
|
48
53
|
loop: false,
|
|
49
|
-
validate: (answer) => answer.length > 0 ? true : "Select at least one agent (
|
|
54
|
+
validate: (answer) => answer.length > 0 ? true : "Select at least one agent (Claude Code, Codex, and/or Cursor).",
|
|
50
55
|
});
|
|
51
56
|
return selected;
|
|
52
57
|
}
|