@goodtek/vibeops 1.1.2 → 2.0.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 (33) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +28 -12
  3. package/dist/bootstrap/installer.js +1 -1
  4. package/dist/cli.js +58 -8
  5. package/dist/commands/init.js +3 -3
  6. package/dist/commands/llm.js +3 -3
  7. package/dist/commands/status.js +1 -0
  8. package/dist/commands/task-add.js +2 -2
  9. package/dist/commands/task-merge.js +134 -0
  10. package/dist/commands/task-release.js +103 -0
  11. package/dist/commands/{task-done.js → task-ship.js} +28 -63
  12. package/dist/commands/task-sync.js +183 -0
  13. package/dist/lib/git.js +7 -0
  14. package/dist/lib/paths.js +1 -1
  15. package/dist/lib/pr-create.js +63 -0
  16. package/dist/lib/resolve-task.js +1 -1
  17. package/dist/lib/task-context.js +22 -7
  18. package/dist/lib/task-git-commit.js +32 -0
  19. package/dist/lib/task-lifecycle-target.js +41 -0
  20. package/dist/lib/task-scaffold.js +1 -1
  21. package/dist/lib/{task-done-llm.js → task-ship-llm.js} +9 -6
  22. package/dist/lib/task.js +7 -0
  23. package/package.json +1 -1
  24. package/templates/clients/claude/CLAUDE.md +5 -27
  25. package/templates/clients/cursor/.cursor/rules/02-git-safety.mdc +5 -5
  26. package/templates/clients/cursor/.cursor/rules/03-docs-before-ship.mdc +13 -0
  27. package/templates/core/AGENTS.md +16 -34
  28. package/templates/core/docs/logs/README.md +1 -1
  29. package/templates/core/docs/project/03-architecture.md +1 -1
  30. package/templates/core/docs/project/05-current-state.md +1 -1
  31. package/templates/core/docs/project/06-decisions.md +1 -1
  32. package/templates/skills-shared/implement-task/SKILL.md +7 -16
  33. package/templates/clients/cursor/.cursor/rules/03-docs-on-done.mdc +0 -13
@@ -17,7 +17,7 @@ function localDateFilename() {
17
17
  async function readOptional(path) {
18
18
  return readTextOrNull(path);
19
19
  }
20
- export async function llmCompleteTaskDone(params) {
20
+ export async function llmCompleteTaskShip(params) {
21
21
  const git = await readGitInfo(params.cwd);
22
22
  let diffSummary = "";
23
23
  if (git.isRepo) {
@@ -31,7 +31,7 @@ export async function llmCompleteTaskDone(params) {
31
31
  const messages = [
32
32
  {
33
33
  role: "system",
34
- content: `You close a VibeOps TASK. Reply with JSON only:
34
+ content: `You ship a VibeOps TASK for review. Reply with JSON only:
35
35
  {
36
36
  "result": "markdown for TASK Result section — facts, paths, commands",
37
37
  "testResult": "markdown for Test Result — commands and outcomes",
@@ -91,7 +91,7 @@ Be factual. Do not invent files not in the diff.`,
91
91
  : null,
92
92
  logLine: typeof parsed.logLine === "string" && parsed.logLine.trim().length > 0
93
93
  ? parsed.logLine.trim()
94
- : `${params.taskId} done.`,
94
+ : `${params.taskId} shipped for review.`,
95
95
  provider,
96
96
  };
97
97
  }
@@ -99,7 +99,7 @@ Be factual. Do not invent files not in the diff.`,
99
99
  return null;
100
100
  }
101
101
  }
102
- export async function applyTaskDoneMemory(cwd, patch) {
102
+ export async function applyTaskShipMemory(cwd, patch) {
103
103
  const paths = projectPaths(cwd);
104
104
  const updated = [];
105
105
  const skipped = [];
@@ -142,12 +142,15 @@ export async function writeTaskResultSections(taskFile, result, testResult) {
142
142
  await updateTaskSection(taskFile, "Result", result);
143
143
  await updateTaskSection(taskFile, "Test Result", testResult);
144
144
  }
145
- /** Minimal fallback when LLM unavailable — git-only sections from diff. */
146
145
  export async function fallbackResultSections(cwd, taskId, taskFile) {
147
146
  const names = await gitDiffNameOnly(cwd);
148
147
  const body = await readText(taskFile);
149
148
  const goal = readSection(body, "Goal").slice(0, 200);
150
- const result = [`Completed ${taskId}.`, goal.length > 0 ? `Goal: ${goal}` : "", names.length > 0 ? `Paths: ${names.slice(0, 15).join(", ")}` : ""]
149
+ const result = [
150
+ `Shipped ${taskId} for review.`,
151
+ goal.length > 0 ? `Goal: ${goal}` : "",
152
+ names.length > 0 ? `Paths: ${names.slice(0, 15).join(", ")}` : "",
153
+ ]
151
154
  .filter((l) => l.length > 0)
152
155
  .join("\n");
153
156
  const testResult = names.length > 0 ? `Changed: ${names.join(", ")}` : "Manual verification required.";
package/dist/lib/task.js CHANGED
@@ -155,6 +155,13 @@ export function pickLatestDoneTask(tasks) {
155
155
  return null;
156
156
  return [...done].sort((a, b) => taskSortKey(b.id) - taskSortKey(a.id))[0];
157
157
  }
158
+ /** Latest TASK in Review (awaiting merge / sync). */
159
+ export function pickLatestReviewTask(tasks) {
160
+ const review = filterActionableTasks(tasks).filter((t) => t.status === "review");
161
+ if (review.length === 0)
162
+ return null;
163
+ return [...review].sort((a, b) => taskSortKey(b.id) - taskSortKey(a.id))[0];
164
+ }
158
165
  export async function loadActionableTasks(tasksDir) {
159
166
  return filterActionableTasks(await scanTasks(tasksDir));
160
167
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodtek/vibeops",
3
- "version": "1.1.2",
3
+ "version": "2.0.0",
4
4
  "description": "Minimal CLI rails for Cursor-based TASK-driven vibe coding.",
5
5
  "type": "module",
6
6
  "author": "VibeOps contributors",
@@ -1,28 +1,6 @@
1
- # {{PROJECT_NAME}} — Claude Code
1
+ # Claude Code — VibeOps
2
2
 
3
- Read **`AGENTS.md`** first (VibeOps workflow and source of truth).
4
-
5
- ## Skills (project)
6
-
7
- | Skill | When |
8
- |-------|------|
9
- | `/plan-task` | Refine `docs/tasks/TASK-NNN-*.md` before coding |
10
- | `/implement-task` | Build per TASK Scope and Acceptance Criteria |
11
-
12
- Skills live in `.claude/skills/`.
13
-
14
- ## Session start
15
-
16
- 1. `docs/project/05-current-state.md`
17
- 2. The **full** current `docs/tasks/TASK-NNN-*.md` file
18
- 3. `docs/project/03-architecture.md` and `06-decisions.md` when relevant
19
-
20
- ## Git
21
-
22
- - Branch: `task/*` from `vibeops task add`
23
- - Commit messages include the TASK id, e.g. `feat(task-015): short title`
24
- - Do not merge to main unless the human runs `vibeops task done` or asks
25
-
26
- ## Finishing
27
-
28
- Fill **Result** and **Test Result** in the TASK file, then tell the human to run `vibeops task done TASK-NNN`.
3
+ - Work from `docs/tasks/TASK-NNN-*.md` only.
4
+ - One TASK at a time.
5
+ - Fill **Result** and **Test Result** before telling the human to run `vibeops task ship TASK-NNN`.
6
+ - Do not merge to integration or main unless the human runs `vibeops task merge` / `task release`.
@@ -1,11 +1,11 @@
1
1
  ---
2
- description: Git safety for task branches and commits
2
+ description: Git safety for TASK branches
3
3
  alwaysApply: true
4
4
  ---
5
5
 
6
6
  # Git safety
7
7
 
8
- - Use branch pattern `task/*` created by `vibeops task add`.
9
- - Include the TASK id in commit messages, e.g. `feat(task-015): short title`.
10
- - **No force-push** to shared branches (`main`, `master`).
11
- - Do not merge or push unless the human runs `vibeops task done` or asks explicitly.
8
+ - Use branch pattern `task/*` from `vibeops task add`.
9
+ - Include TASK id in commits: `feat(task-nnn): …`.
10
+ - No force-push to shared branches.
11
+ - Run `vibeops task ship`, `task merge`, `task sync` when the human asks — do not merge locally in the IDE unless requested.
@@ -0,0 +1,13 @@
1
+ ---
2
+ description: Update TASK Result and project memory before shipping
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Docs before task ship
7
+
8
+ Before `vibeops task ship`:
9
+
10
+ 1. Fill **Result** and **Test Result** in the TASK file (paths, commands, outcomes — facts only).
11
+ 2. If architecture or decisions changed, note them in the TASK; `task ship` can update `docs/project/*` via LLM.
12
+
13
+ Do not ship with placeholder `(not yet)` sections.
@@ -1,44 +1,26 @@
1
- # {{PROJECT_NAME}} — AI agent guide
1
+ # Project — AI Agent Guide
2
2
 
3
- > Installed by **VibeOps**. Agents read this repo and `docs/tasks/`, not chat history.
3
+ > Installed by VibeOps. Read before coding.
4
4
 
5
- ## Source of truth
5
+ ## TASK workflow
6
6
 
7
- | What | Where |
8
- |------|--------|
9
- | Current work | `docs/tasks/TASK-NNN-*.md` |
10
- | Project memory | `docs/project/05-current-state.md`, `03-architecture.md`, `06-decisions.md` |
11
- | Change history | Git commits on task branches |
12
- | **Not** trusted | Chat history, Slack |
13
-
14
- ## Before you code
7
+ ```bash
8
+ vibeops task add
9
+ # Plan / build in your agent (@docs/tasks/TASK-NNN-*.md)
15
10
 
16
- 1. `docs/project/05-current-state.md`
17
- 2. `docs/project/03-architecture.md` and `06-decisions.md` when relevant
18
- 3. **The full current TASK file** under `docs/tasks/`
11
+ vibeops task ship
12
+ vibeops task merge
13
+ vibeops task sync
14
+ ```
19
15
 
20
- ## Workflow (human + CLI)
16
+ Optional release to production: `vibeops task release`.
21
17
 
22
18
  ```bash
23
- vibeops init # once (pick Cursor / Claude Code / Codex packs)
24
- vibeops task add # new TASK + branch
25
- # Plan: refine TASK file with your agent (see client skills below)
26
- # Build: implement per TASK Scope / Acceptance Criteria
27
- vibeops task done # close TASK, update project docs, merge
28
- vibeops status # briefing
29
- vibeops llm connect # LLM for task add / task done
19
+ vibeops llm connect # optional — task add / task ship
30
20
  ```
31
21
 
32
- ## Client packs (installed at init)
33
-
34
- | Tool | Rules / guide | Skills |
35
- |------|----------------|--------|
36
- | **Cursor** | `.cursor/rules/` | `.cursor/skills/` (`plan-task`, `implement-task`) |
37
- | **Claude Code** | `CLAUDE.md` | `.claude/skills/` |
38
- | **Codex CLI** | `AGENTS.md` (this file) | `.agents/skills/` |
39
-
40
- ## Rules (all agents)
22
+ ## Rules
41
23
 
42
- - **One TASK at a time** — stay inside Scope and Acceptance Criteria.
43
- - **Search** before adding files; reuse existing patterns.
44
- - Fill **Result** and **Test Result** before `vibeops task done`.
24
+ - One TASK at a time; scope from `docs/tasks/TASK-NNN-*.md`.
25
+ - Fill **Result** and **Test Result** before `vibeops task ship`.
26
+ - Agents do not merge or sync unless the human asks.
@@ -2,6 +2,6 @@
2
2
 
3
3
  Append-only files: `docs/logs/YYYY-MM-DD.md`.
4
4
 
5
- `vibeops task done` may append a short entry when a TASK closes.
5
+ `vibeops task ship` may append a short entry via LLM when shipping a TASK.
6
6
 
7
7
  Keep entries factual: TASK id, paths touched, commands run.
@@ -1,6 +1,6 @@
1
1
  # Architecture
2
2
 
3
- > Living overview. Update when structure or major paths change (often via `vibeops task done`).
3
+ > Living overview. Update when structure or major paths change (often via `vibeops task ship`).
4
4
 
5
5
  ## System
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Current state
2
2
 
3
- > Facts only. Updated by `vibeops task done` and humans.
3
+ > Facts only. Updated by `vibeops task ship` / humans; stage changes on `task sync`.
4
4
 
5
5
  ## Stage
6
6
 
@@ -5,5 +5,5 @@
5
5
  ## D-001 · VibeOps workflow
6
6
 
7
7
  - **Date:** {{CREATED_AT}}
8
- - **Decision:** TASK-driven development with `vibeops task add` / `task done` and Cursor for plan/build.
8
+ - **Decision:** TASK-driven development with `vibeops task add` / `task ship` / `merge` / `sync` and Cursor for plan/build.
9
9
  - **Why:** Git `docs/tasks` beats chat as source of truth.
@@ -1,22 +1,13 @@
1
1
  ---
2
2
  name: implement-task
3
- description: Implements the current VibeOps TASK per Scope and Acceptance Criteria. Use when building features for docs/tasks/TASK-NNN.md.
4
- disable-model-invocation: true
3
+ description: Implement the current VibeOps TASK file in the repo.
5
4
  ---
6
5
 
7
- # Implement a TASK
6
+ # Implement TASK
8
7
 
9
- ## Read first
8
+ 1. Read the full `docs/tasks/TASK-NNN-*.md` (Scope, Acceptance Criteria, Test Plan).
9
+ 2. Search the codebase before adding new patterns.
10
+ 3. Implement only within the TASK scope.
11
+ 4. Do not run `vibeops task ship`, `merge`, or `sync` — the human runs the CLI lifecycle.
10
12
 
11
- 1. `AGENTS.md` and your agent rules (e.g. `.cursor/rules/`, `CLAUDE.md`)
12
- 2. `docs/project/05-current-state.md`, `03-architecture.md`, `06-decisions.md`
13
- 3. The TASK file referenced by the human
14
-
15
- ## Instructions
16
-
17
- 1. Work **only** within Scope and Acceptance Criteria.
18
- 2. Search the repo before adding files; match existing patterns.
19
- 3. Fill **Result** and **Test Result** with facts when done.
20
- 4. Do not run `vibeops task done` or merge — the human closes the TASK.
21
-
22
- Tell the human to run `vibeops task done TASK-NNN` when ready.
13
+ When implementation is ready, tell the human to run `vibeops task ship TASK-NNN`.
@@ -1,13 +0,0 @@
1
- ---
2
- description: Update TASK Result and project memory when finishing work
3
- alwaysApply: true
4
- ---
5
-
6
- # Docs when finishing a TASK
7
-
8
- Before `vibeops task done`:
9
-
10
- 1. Fill **Result** and **Test Result** in the TASK file (paths, commands, outcomes — facts only).
11
- 2. If architecture or decisions changed, note them in the TASK; `task done` updates `docs/project/*`.
12
-
13
- Do not mark a TASK complete with placeholder `(not yet)` sections.