goalbuddy 0.2.22 → 0.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/CONTRIBUTING.md +14 -5
- package/README.md +62 -41
- package/goalbuddy/SKILL.md +8 -8
- package/goalbuddy/agents/README.md +15 -8
- package/internal/assets/goalbuddy-live-board.jpg +0 -0
- package/internal/cli/goal-maker.mjs +352 -20
- package/internal/cli/postinstall.mjs +3 -3
- package/package.json +6 -2
- package/plugins/goalbuddy/.claude-plugin/plugin.json +24 -0
- package/plugins/goalbuddy/.codex-plugin/plugin.json +5 -4
- package/plugins/goalbuddy/README.md +26 -12
- package/plugins/goalbuddy/agents/goal-judge.md +27 -0
- package/plugins/goalbuddy/agents/goal-scout.md +24 -0
- package/plugins/goalbuddy/agents/goal-worker.md +26 -0
- package/plugins/goalbuddy/skills/goalbuddy/SKILL.md +8 -8
- package/plugins/goalbuddy/skills/goalbuddy/agents/README.md +15 -8
package/CONTRIBUTING.md
CHANGED
|
@@ -14,12 +14,20 @@ npm run check
|
|
|
14
14
|
|
|
15
15
|
## Local Install Test
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
GoalBuddy installs into Codex and Claude Code by default. Use temporary home directories so local testing does not overwrite your real install:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
+
# Both targets
|
|
21
|
+
root=$(mktemp -d)
|
|
22
|
+
node internal/cli/goal-maker.mjs --codex-home "$root/codex" --claude-home "$root/claude"
|
|
23
|
+
node internal/cli/goal-maker.mjs doctor --target codex --codex-home "$root/codex"
|
|
24
|
+
node internal/cli/goal-maker.mjs doctor --target claude --claude-home "$root/claude"
|
|
25
|
+
rm -rf "$root"
|
|
26
|
+
|
|
27
|
+
# One target
|
|
20
28
|
tmp=$(mktemp -d)
|
|
21
|
-
node internal/cli/goal-maker.mjs install --
|
|
22
|
-
node internal/cli/goal-maker.mjs doctor --
|
|
29
|
+
node internal/cli/goal-maker.mjs install --target claude --claude-home "$tmp"
|
|
30
|
+
node internal/cli/goal-maker.mjs doctor --target claude --claude-home "$tmp"
|
|
23
31
|
rm -rf "$tmp"
|
|
24
32
|
```
|
|
25
33
|
|
|
@@ -31,7 +39,7 @@ Before opening a PR, verify the npm package contents:
|
|
|
31
39
|
npm pack --dry-run
|
|
32
40
|
```
|
|
33
41
|
|
|
34
|
-
The package should include `README.md`, `internal/assets/`, `package.json`, `internal/cli/`, the canonical `goalbuddy/` skill directory, and `plugins/goalbuddy
|
|
42
|
+
The package should include `README.md`, `internal/assets/`, `package.json`, `internal/cli/`, the canonical `goalbuddy/` skill directory, and `plugins/goalbuddy/` (with both `.codex-plugin/` and `.claude-plugin/` manifests). The temporary `$goal-maker` compatibility skill is generated by the installer; do not add a second tracked skill payload.
|
|
35
43
|
|
|
36
44
|
## Releases
|
|
37
45
|
|
|
@@ -40,7 +48,8 @@ GoalBuddy publishes from GitHub Actions with npm trusted publishing. See [RELEAS
|
|
|
40
48
|
## Contribution Guidelines
|
|
41
49
|
|
|
42
50
|
- Keep the runtime dependency-free unless there is a strong reason.
|
|
43
|
-
- Keep `goalbuddy/` installable as the canonical
|
|
51
|
+
- Keep `goalbuddy/` installable as the canonical skill directory.
|
|
52
|
+
- Keep installation working for both Codex and Claude Code.
|
|
44
53
|
- Keep `$goal-maker` working as a generated compatibility alias until the migration window ends.
|
|
45
54
|
- Prefer small, reviewable changes.
|
|
46
55
|
- Update README or templates when behavior changes.
|
package/README.md
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<a href="https://goalbuddy.dev">
|
|
5
|
-
<img src="internal/assets/goalbuddy-readme-hero.png" alt="GoalBuddy
|
|
5
|
+
<img src="internal/assets/goalbuddy-readme-hero.png" alt="GoalBuddy: a /goal operating system for Codex and Claude Code with live boards, Scout, Judge, Worker, receipts, and verification." width="100%">
|
|
6
6
|
</a>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<strong>
|
|
10
|
+
<strong>A /goal operating system for Codex and Claude Code: intake, live boards, agents, receipts, and verification.</strong>
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
@@ -16,10 +16,12 @@
|
|
|
16
16
|
<a href="https://goalbuddy.dev"><img alt="goalbuddy.dev" src="https://img.shields.io/badge/site-goalbuddy.dev-684cff?style=flat-square"></a>
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
|
-
GoalBuddy is a local
|
|
19
|
+
GoalBuddy is a local companion for **Codex** and **Claude Code** when the work is too broad to trust to a single prompt. It turns rough intent into a durable operating loop: a `goal.md` charter, a machine-readable `state.yaml` board, optional visual boards, Scout/Judge/Worker task flow, compact receipts, and verification before completion.
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npx goalbuddy
|
|
22
|
+
npx goalbuddy # installs for Codex and Claude Code
|
|
23
|
+
npx goalbuddy --target codex # installs for Codex only
|
|
24
|
+
npx goalbuddy --target claude # installs for Claude Code only
|
|
23
25
|
```
|
|
24
26
|
|
|
25
27
|
Or install it globally:
|
|
@@ -28,19 +30,20 @@ Or install it globally:
|
|
|
28
30
|
npm i -g goalbuddy
|
|
29
31
|
```
|
|
30
32
|
|
|
31
|
-
Then restart
|
|
33
|
+
Then restart your AI coding agent and invoke the installed skill:
|
|
32
34
|
|
|
33
35
|
```text
|
|
34
|
-
$goal-prep
|
|
36
|
+
$goal-prep # in Codex
|
|
37
|
+
/goal-prep # in Claude Code
|
|
35
38
|
```
|
|
36
39
|
|
|
37
|
-
|
|
40
|
+
`goal-prep` prepares the GoalBuddy board and prints the `/goal` command to run next. It does not start `/goal` automatically.
|
|
38
41
|
|
|
39
42
|
## Why GoalBuddy Exists
|
|
40
43
|
|
|
41
|
-
Long Codex
|
|
44
|
+
Long-running goals in Codex and Claude Code drift. A request like "improve this project" can turn into unbounded edits, stale verification, and premature completion claims.
|
|
42
45
|
|
|
43
|
-
GoalBuddy gives
|
|
46
|
+
GoalBuddy gives your AI coding agent a durable loop:
|
|
44
47
|
|
|
45
48
|
```text
|
|
46
49
|
vague goal -> Scout -> Judge -> Worker -> receipt -> verify -> repeat
|
|
@@ -70,40 +73,32 @@ GoalBuddy uses four primitives:
|
|
|
70
73
|
- **Task**: exactly one active Scout, Judge, Worker, or PM task.
|
|
71
74
|
- **Receipt**: compact proof for every completed, blocked, or escalated task.
|
|
72
75
|
|
|
73
|
-
GoalBuddy bundles default agent templates.
|
|
76
|
+
GoalBuddy bundles default agent templates. `goal-prep` records whether matching installed agent configs were actually found; if not, `/goal` can continue through PM fallback, or you can install dedicated agents with:
|
|
74
77
|
|
|
75
78
|
```bash
|
|
76
|
-
npx goalbuddy agents
|
|
79
|
+
npx goalbuddy agents # Codex TOML agents
|
|
80
|
+
npx goalbuddy agents --target claude # Claude Code markdown subagents
|
|
77
81
|
```
|
|
78
82
|
|
|
79
83
|
- **Scout** maps repo evidence, workflows, constraints, risks, and candidate next tasks.
|
|
80
84
|
- **Judge** resolves ambiguity, scope, risk, task selection, and completion claims.
|
|
81
85
|
- **Worker** performs one bounded implementation or recovery slice with explicit files and checks.
|
|
82
86
|
|
|
83
|
-
## Install
|
|
84
|
-
|
|
85
|
-
Install and enable the native Codex plugin:
|
|
87
|
+
## Install Everywhere
|
|
86
88
|
|
|
87
89
|
```bash
|
|
88
90
|
npx goalbuddy
|
|
89
91
|
```
|
|
90
92
|
|
|
91
|
-
Restart Codex, then use `$goal-prep
|
|
93
|
+
This installs and enables the native Codex plugin in `~/.codex/`, then installs the GoalBuddy skill, Scout/Judge/Worker subagents, and `/goal-prep` slash command into `~/.claude/`. Restart Codex and Claude Code, then use `$goal-prep` in Codex or `/goal-prep` in Claude Code. The Codex plugin bundles the local live board and GitHub Projects visual board backends so Goal Prep can offer a board immediately.
|
|
92
94
|
|
|
93
|
-
If you prefer a global executable
|
|
95
|
+
If you prefer a global executable:
|
|
94
96
|
|
|
95
97
|
```bash
|
|
96
98
|
npm i -g goalbuddy
|
|
97
99
|
goalbuddy
|
|
98
100
|
```
|
|
99
101
|
|
|
100
|
-
Use the skill-only fallback if your Codex build does not support plugins:
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
npx goalbuddy install
|
|
104
|
-
npx goalbuddy update
|
|
105
|
-
```
|
|
106
|
-
|
|
107
102
|
Native Codex `/goal` is still an under-development Codex feature. Before relying on the printed command, confirm your local Codex runtime is logged in and has goals enabled:
|
|
108
103
|
|
|
109
104
|
```bash
|
|
@@ -112,35 +107,40 @@ codex features enable goals
|
|
|
112
107
|
npx goalbuddy doctor --goal-ready
|
|
113
108
|
```
|
|
114
109
|
|
|
115
|
-
|
|
110
|
+
## Install One Target
|
|
111
|
+
|
|
112
|
+
Use `--target` when you only want to install or update one agent environment:
|
|
116
113
|
|
|
117
114
|
```bash
|
|
118
|
-
npx goalbuddy
|
|
115
|
+
npx goalbuddy --target codex
|
|
116
|
+
npx goalbuddy --target claude
|
|
119
117
|
```
|
|
120
118
|
|
|
121
|
-
|
|
119
|
+
The Claude Code target installs the GoalBuddy skill, the three Scout/Judge/Worker subagents, and the `/goal-prep` slash command into `~/.claude/`. Restart Claude Code, then run:
|
|
122
120
|
|
|
123
|
-
```
|
|
124
|
-
|
|
121
|
+
```text
|
|
122
|
+
/goal-prep
|
|
125
123
|
```
|
|
126
124
|
|
|
127
|
-
Check
|
|
125
|
+
Check the local Claude Code install:
|
|
128
126
|
|
|
129
127
|
```bash
|
|
130
|
-
npx goalbuddy
|
|
128
|
+
npx goalbuddy doctor --target claude
|
|
131
129
|
```
|
|
132
130
|
|
|
133
|
-
Use
|
|
131
|
+
Use non-default homes:
|
|
134
132
|
|
|
135
133
|
```bash
|
|
136
|
-
npx goalbuddy --codex-home /path/to/.codex
|
|
134
|
+
npx goalbuddy --codex-home /path/to/.codex --claude-home /path/to/.claude
|
|
135
|
+
npx goalbuddy --target codex --codex-home /path/to/.codex
|
|
136
|
+
npx goalbuddy --target claude --claude-home /path/to/.claude
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
-
`
|
|
139
|
+
`install` and `update` prepare both targets by default. `install`, `update`, `doctor`, and `agents` all accept `--target claude|codex`, and `--json` for structured output.
|
|
140
140
|
|
|
141
141
|
## Run A Goal
|
|
142
142
|
|
|
143
|
-
After
|
|
143
|
+
After `goal-prep` creates or repairs the board, start the run with the printed command:
|
|
144
144
|
|
|
145
145
|
```text
|
|
146
146
|
/goal Follow docs/goals/<slug>/goal.md.
|
|
@@ -149,7 +149,10 @@ After `$goal-prep` creates or repairs the board, start the run with the printed
|
|
|
149
149
|
Check board health at any time:
|
|
150
150
|
|
|
151
151
|
```bash
|
|
152
|
+
# Codex
|
|
152
153
|
node ~/.codex/skills/goalbuddy/scripts/check-goal-state.mjs docs/goals/<slug>/state.yaml
|
|
154
|
+
# Claude Code
|
|
155
|
+
node ~/.claude/skills/goalbuddy/scripts/check-goal-state.mjs docs/goals/<slug>/state.yaml
|
|
153
156
|
```
|
|
154
157
|
|
|
155
158
|
For a broad prompt like "Improve my project," the first active task should usually be Scout, not Worker:
|
|
@@ -181,9 +184,17 @@ tasks:
|
|
|
181
184
|
receipt: null
|
|
182
185
|
```
|
|
183
186
|
|
|
187
|
+
## Visual Boards
|
|
188
|
+
|
|
189
|
+
GoalBuddy can show progress as the goal runs. `goal-prep` can open a local live board inside your AI coding agent before the task list is finished, or prepare a GitHub Projects sync when stakeholders need an external board.
|
|
190
|
+
|
|
191
|
+
<p align="center">
|
|
192
|
+
<img src="internal/assets/goalbuddy-live-board.jpg" alt="GoalBuddy local live board open next to Codex while Scout, Judge, and Worker tasks populate." width="100%">
|
|
193
|
+
</p>
|
|
194
|
+
|
|
184
195
|
## Extensions
|
|
185
196
|
|
|
186
|
-
The npm package is the stable core. Local Board and GitHub Projects are bundled into the installed GoalBuddy skill so
|
|
197
|
+
The npm package is the stable core. Local Board and GitHub Projects are bundled into the installed GoalBuddy skill so `goal-prep` can offer a visual board immediately. Other optional extensions live under `extend/` and are discovered from the GitHub-hosted `extend/catalog.json`, so users do not need a new npm release for every integration.
|
|
187
198
|
|
|
188
199
|
```bash
|
|
189
200
|
npx goalbuddy board docs/goals/<slug>
|
|
@@ -228,20 +239,30 @@ Release automation for future npm publishes is documented in [RELEASE.md](RELEAS
|
|
|
228
239
|
|
|
229
240
|
## Repo Map
|
|
230
241
|
|
|
231
|
-
- `goalbuddy/SKILL.md`: canonical Codex
|
|
232
|
-
- `goalbuddy/agents/`: Scout, Judge, and Worker definitions
|
|
242
|
+
- `goalbuddy/SKILL.md`: canonical skill definition (shared by Codex and Claude Code)
|
|
243
|
+
- `goalbuddy/agents/`: Scout, Judge, and Worker agent definitions (Codex TOML; Claude Code markdown lives under `plugins/goalbuddy/agents/`)
|
|
233
244
|
- `goalbuddy/templates/`: `goal.md`, `state.yaml`, and `note.md`
|
|
234
245
|
- `goalbuddy/scripts/check-goal-state.mjs`: v2 board checker
|
|
235
|
-
- `internal/cli/goal-maker.mjs`: npm installer CLI
|
|
236
|
-
- `plugins/goalbuddy/`:
|
|
246
|
+
- `internal/cli/goal-maker.mjs`: npm installer CLI for Codex and Claude Code
|
|
247
|
+
- `plugins/goalbuddy/`: Codex plugin (`.codex-plugin/`) and Claude Code plugin (`.claude-plugin/`) scaffolds
|
|
237
248
|
- `extend/` and `extend/catalog.json`: GitHub-hosted extension surface
|
|
238
249
|
- `examples/`: completed sample runs
|
|
239
250
|
|
|
240
251
|
## Status
|
|
241
252
|
|
|
242
|
-
`0.
|
|
253
|
+
`0.3.x` adds first-class Claude Code support alongside the existing Codex target. The v2 board and receipt model intentionally rejects old v1 `gate`, `units`, `artifacts`, and `evidence.jsonl` goal folders instead of auto-migrating them.
|
|
254
|
+
|
|
255
|
+
Use GoalBuddy to structure autonomous coding-agent work. Keep relying on repo-specific `AGENTS.md`/`CLAUDE.md`, tests, and CI for repo facts.
|
|
256
|
+
|
|
257
|
+
## Star History
|
|
243
258
|
|
|
244
|
-
|
|
259
|
+
<a href="https://www.star-history.com/?repos=tolibear%2Fgoalbuddy&type=date&legend=top-left">
|
|
260
|
+
<picture>
|
|
261
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=tolibear/goalbuddy&type=date&theme=dark&legend=top-left" />
|
|
262
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=tolibear/goalbuddy&type=date&legend=top-left" />
|
|
263
|
+
<img alt="Star History Chart" src="https://api.star-history.com/chart?repos=tolibear/goalbuddy&type=date&legend=top-left" />
|
|
264
|
+
</picture>
|
|
265
|
+
</a>
|
|
245
266
|
|
|
246
267
|
## License
|
|
247
268
|
|
package/goalbuddy/SKILL.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: goal-prep
|
|
3
|
-
description: Goal Prep for GoalBuddy. Use for broad, long-running, stalled, vague, detailed, planned, or unhealthy Codex work that needs a structured /goal intake, autonomous task discovery, role-tagged Scout/Judge/Worker delegation, one active task, durable receipts, and a PM-owned rolling board that maximizes the chance of a successful goal run.
|
|
3
|
+
description: Goal Prep for GoalBuddy. Use for broad, long-running, stalled, vague, detailed, planned, or unhealthy Codex or Claude Code work that needs a structured /goal intake, autonomous task discovery, role-tagged Scout/Judge/Worker delegation, one active task, durable receipts, and a PM-owned rolling board that maximizes the chance of a successful goal run.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Goal Prep
|
|
7
7
|
|
|
8
|
-
`$goal-prep` prepares a GoalBuddy board. It does not start `/goal` automatically, but the board and starter `/goal` command must be shaped so the next run continues into safe execution by default.
|
|
8
|
+
`$goal-prep` (Codex) or `/goal-prep` (Claude Code) prepares a GoalBuddy board. It does not start `/goal` automatically, but the board and starter `/goal` command must be shaped so the next run continues into safe execution by default.
|
|
9
9
|
|
|
10
|
-
GoalBuddy is for autonomous, long-running Codex work where the PM thread may need to discover the work, define tasks, sequence them, delegate them, execute them, verify them, and keep going without the human decomposing every step.
|
|
10
|
+
GoalBuddy is for autonomous, long-running Codex or Claude Code work where the PM thread may need to discover the work, define tasks, sequence them, delegate them, execute them, verify them, and keep going without the human decomposing every step.
|
|
11
11
|
|
|
12
12
|
The loop is:
|
|
13
13
|
|
|
@@ -81,11 +81,11 @@ Do you want to set up a visual board for this?
|
|
|
81
81
|
|
|
82
82
|
Recommended options:
|
|
83
83
|
|
|
84
|
-
1. Local live board
|
|
84
|
+
1. Local live board (Recommended) - starts immediately, requires no credentials, and lets the user watch tasks populate inside Codex or Claude Code.
|
|
85
85
|
2. GitHub Projects - best when stakeholders need a shared external board and the user can approve GitHub credentials/project details.
|
|
86
86
|
3. No visual board - best for quick or private goals where the file board is enough.
|
|
87
87
|
|
|
88
|
-
If the user chooses the local live board, create the goal directory, `notes/`, and an initial minimal `state.yaml` as soon as the slug is known, then run `npx goalbuddy board docs/goals/<slug>` and open the printed local URL in the Codex in-app Browser. In short: start the local board before filling the task list so the board pops up right away and cards populate live as `state.yaml` changes. Keep the printed URL in the final prep response as a fallback, but do not make the URL the primary experience.
|
|
88
|
+
If the user chooses the local live board, create the goal directory, `notes/`, and an initial minimal `state.yaml` as soon as the slug is known, then run `npx goalbuddy board docs/goals/<slug>` and open the printed local URL in the AI coding agent's in-app browser (the Codex in-app Browser, the Claude Code preview, or the user's regular browser). In short: start the local board before filling the task list so the board pops up right away and cards populate live as `state.yaml` changes. Keep the printed URL in the final prep response as a fallback, but do not make the URL the primary experience.
|
|
89
89
|
|
|
90
90
|
If the user chooses GitHub Projects, ask for approval and the required project target before any live write. Create or sync the GitHub Project at the same early point as the local board: after the goal root and skeleton `state.yaml` exist, before the detailed task list is finished, then sync again as tasks populate. Run a dry-run sync first when possible. Missing GitHub credentials or project details should not block local board creation or goal prep; record the missing requirement in `visual_board.github_projects` and seed a PM setup task.
|
|
91
91
|
|
|
@@ -138,11 +138,11 @@ Minimum diagnostic ladder for vague, strategic, or improvement-oriented goals:
|
|
|
138
138
|
2. Intent target: what kind of improvement or outcome matters most?
|
|
139
139
|
3. Success proof: what evidence would convince the user this worked?
|
|
140
140
|
4. Scope and non-goals: what should remain untouched or explicitly out of scope?
|
|
141
|
-
5.
|
|
141
|
+
5. Goal handling: reuse an existing goal, create a fresh goal, or inspect first?
|
|
142
142
|
|
|
143
143
|
Ask these one at a time. Skip a step only when the user's words already answer it clearly. After the user answers one step, do not assume the remaining steps; ask the next unresolved material question.
|
|
144
144
|
|
|
145
|
-
For "make GoalBuddy better", a good first question is which improvement target matters most: intake clarity, board/execution reliability, completion proof/eval coverage, or user experience during long-running goals. A good second question asks what proof would convince the user it improved. A good third question asks whether to reuse an existing
|
|
145
|
+
For "make GoalBuddy better", a good first question is which improvement target matters most: intake clarity, board/execution reliability, completion proof/eval coverage, or user experience during long-running goals. A good second question asks what proof would convince the user it improved. A good third question asks whether to reuse an existing goal, create a fresh goal, or inspect first.
|
|
146
146
|
|
|
147
147
|
## Direct `/goal` Entry
|
|
148
148
|
|
|
@@ -173,7 +173,7 @@ Do:
|
|
|
173
173
|
- classify the goal as `specific`, `open_ended`, `existing_plan`, `recovery`, or `audit`;
|
|
174
174
|
- create or repair `docs/goals/<slug>/`;
|
|
175
175
|
- create `goal.md`, `state.yaml`, and `notes/`;
|
|
176
|
-
- if requested, start the local visual board immediately and open it in the Codex in-app Browser before filling the task list;
|
|
176
|
+
- if requested, start the local visual board immediately and open it in the AI coding agent's in-app browser (Codex in-app Browser, Claude Code preview, or the user's regular browser) before filling the task list;
|
|
177
177
|
- seed a role-tagged task board that matches the input shape;
|
|
178
178
|
- make the first active task safe;
|
|
179
179
|
- verify Scout, Worker, and Judge agent availability or record an explicit truthful state;
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
# GoalBuddy Agents
|
|
2
2
|
|
|
3
|
-
This directory contains
|
|
3
|
+
This directory contains skill metadata and bundled agent definitions for Codex and Claude Code.
|
|
4
|
+
|
|
5
|
+
## Files
|
|
4
6
|
|
|
5
7
|
- `openai.yaml` stays with the skill as metadata.
|
|
6
|
-
- `
|
|
8
|
+
- `goal_scout.toml`, `goal_judge.toml`, `goal_worker.toml` — Codex agent configs. Copy into `.codex/agents/` for project-scoped agents or `~/.codex/agents/` for personal agents.
|
|
9
|
+
- Claude Code agent markdown lives in `plugins/goalbuddy/agents/` (installed to `~/.claude/agents/` by `npx goalbuddy --target claude`).
|
|
10
|
+
|
|
11
|
+
## Agent Matrix
|
|
7
12
|
|
|
8
|
-
| Agent |
|
|
9
|
-
|
|
10
|
-
| Scout | `goal_scout.toml` | medium | read-only |
|
|
11
|
-
| Worker | `goal_worker.toml` | low | workspace-write |
|
|
12
|
-
| Judge | `goal_judge.toml` | high | read-only |
|
|
13
|
+
| Agent | Codex file | Claude Code file | Reasoning effort | Write scope |
|
|
14
|
+
|---|---|---|---:|---|
|
|
15
|
+
| Scout | `goal_scout.toml` | `goal-scout.md` | medium | read-only |
|
|
16
|
+
| Worker | `goal_worker.toml` | `goal-worker.md` | low | workspace-write |
|
|
17
|
+
| Judge | `goal_judge.toml` | `goal-judge.md` | high | read-only |
|
|
13
18
|
|
|
14
|
-
Recommended
|
|
19
|
+
## Recommended Codex Config
|
|
15
20
|
|
|
16
21
|
```toml
|
|
17
22
|
[agents]
|
|
@@ -20,4 +25,6 @@ max_depth = 1
|
|
|
20
25
|
job_max_runtime_seconds = 1800
|
|
21
26
|
```
|
|
22
27
|
|
|
28
|
+
## Authority Boundary
|
|
29
|
+
|
|
23
30
|
Only the main `/goal` PM loop may select the active task, mark tasks done, update board truth, or mark the goal complete.
|
|
Binary file
|
|
@@ -25,24 +25,33 @@ const canonicalSkillDirectory = "goalbuddy";
|
|
|
25
25
|
const legacyCliName = "goal-maker";
|
|
26
26
|
const legacySkillName = "goal-maker";
|
|
27
27
|
const skillSource = join(packageRoot, canonicalSkillDirectory);
|
|
28
|
+
const claudePluginSource = join(packageRoot, "plugins", "goalbuddy");
|
|
28
29
|
const packageInfo = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
|
|
29
30
|
const defaultCodexHome = process.env.CODEX_HOME || join(homedir(), ".codex");
|
|
31
|
+
const defaultClaudeHome = process.env.CLAUDE_HOME || join(homedir(), ".claude");
|
|
30
32
|
const defaultCatalogUrl = "https://raw.githubusercontent.com/tolibear/goalbuddy/main/extend/catalog.json";
|
|
31
33
|
const requiredAgentFiles = [
|
|
32
34
|
"goal_judge.toml",
|
|
33
35
|
"goal_scout.toml",
|
|
34
36
|
"goal_worker.toml",
|
|
35
37
|
];
|
|
38
|
+
const requiredClaudeAgentFiles = [
|
|
39
|
+
"goal-scout.md",
|
|
40
|
+
"goal-judge.md",
|
|
41
|
+
"goal-worker.md",
|
|
42
|
+
];
|
|
36
43
|
const bundledCoreExtensionIds = new Set(["github-projects", "local-goal-board"]);
|
|
37
44
|
const optionsWithValues = new Set([
|
|
38
45
|
"--catalog",
|
|
39
46
|
"--catalog-url",
|
|
47
|
+
"--claude-home",
|
|
40
48
|
"--codex-home",
|
|
41
49
|
"--goal",
|
|
42
50
|
"--host",
|
|
43
51
|
"--kind",
|
|
44
52
|
"--port",
|
|
45
53
|
"--source",
|
|
54
|
+
"--target",
|
|
46
55
|
]);
|
|
47
56
|
|
|
48
57
|
const args = process.argv.slice(2);
|
|
@@ -62,17 +71,37 @@ async function main() {
|
|
|
62
71
|
maybePrintLegacyNotice();
|
|
63
72
|
switch (command) {
|
|
64
73
|
case "default":
|
|
65
|
-
|
|
74
|
+
if (installTargetMode() === "all") {
|
|
75
|
+
await installEverywhere();
|
|
76
|
+
} else if (installTargetMode() === "codex") {
|
|
77
|
+
installPlugin();
|
|
78
|
+
} else {
|
|
79
|
+
await installClaudeAll();
|
|
80
|
+
}
|
|
66
81
|
break;
|
|
67
82
|
case "install":
|
|
68
83
|
case "update":
|
|
69
|
-
|
|
84
|
+
if (installTargetMode() === "all") {
|
|
85
|
+
await installEverywhere();
|
|
86
|
+
} else if (installTargetMode() === "codex") {
|
|
87
|
+
await installAll();
|
|
88
|
+
} else {
|
|
89
|
+
await installClaudeAll();
|
|
90
|
+
}
|
|
70
91
|
break;
|
|
71
92
|
case "agents":
|
|
72
|
-
|
|
93
|
+
if (targetMode() === "codex") {
|
|
94
|
+
installAgents();
|
|
95
|
+
} else {
|
|
96
|
+
installClaudeAgents();
|
|
97
|
+
}
|
|
73
98
|
break;
|
|
74
99
|
case "doctor":
|
|
75
|
-
|
|
100
|
+
if (targetMode() === "codex") {
|
|
101
|
+
doctor();
|
|
102
|
+
} else {
|
|
103
|
+
doctorClaude();
|
|
104
|
+
}
|
|
76
105
|
break;
|
|
77
106
|
case "check-update":
|
|
78
107
|
case "update-check":
|
|
@@ -146,15 +175,15 @@ function positionalArgs() {
|
|
|
146
175
|
}
|
|
147
176
|
|
|
148
177
|
function usage() {
|
|
149
|
-
console.log(
|
|
178
|
+
console.log(`${canonicalProductName} for Claude Code and Codex
|
|
150
179
|
|
|
151
180
|
Usage:
|
|
152
|
-
${canonicalCliName} [--codex-home <path>] [--json]
|
|
181
|
+
${canonicalCliName} [--target claude|codex] [--claude-home <path>] [--codex-home <path>] [--json]
|
|
153
182
|
${canonicalCliName} plugin install [--source <marketplace-source>] [--codex-home <path>] [--json]
|
|
154
|
-
${canonicalCliName} install [--codex-home <path>] [--force] [--json]
|
|
155
|
-
${canonicalCliName} update [--codex-home <path>] [--json]
|
|
156
|
-
${canonicalCliName} agents [--codex-home <path>] [--force]
|
|
157
|
-
${canonicalCliName} doctor [--codex-home <path>] [--goal-ready]
|
|
183
|
+
${canonicalCliName} install [--target claude|codex] [--claude-home <path>] [--codex-home <path>] [--force] [--json]
|
|
184
|
+
${canonicalCliName} update [--target claude|codex] [--claude-home <path>] [--codex-home <path>] [--json]
|
|
185
|
+
${canonicalCliName} agents [--target claude|codex] [--claude-home <path>] [--codex-home <path>] [--force]
|
|
186
|
+
${canonicalCliName} doctor [--target claude|codex] [--claude-home <path>] [--codex-home <path>] [--goal-ready]
|
|
158
187
|
${canonicalCliName} check-update [--json]
|
|
159
188
|
${canonicalCliName} extend [--catalog-url <url-or-path>] [--kind <kind>] [--json]
|
|
160
189
|
${canonicalCliName} extend <id> [--catalog-url <url-or-path>] [--json]
|
|
@@ -163,17 +192,19 @@ Usage:
|
|
|
163
192
|
${canonicalCliName} extend doctor [<id>] [--codex-home <path>] [--json]
|
|
164
193
|
${canonicalCliName} board <docs/goals/slug> [--catalog-url <url-or-path>] [--host <host>] [--port <port>] [--once] [--json]
|
|
165
194
|
|
|
166
|
-
|
|
167
|
-
${canonicalCliName} Installs and enables the native Codex plugin.
|
|
195
|
+
Targets: by default, install/update prepares both Codex (~/.codex) and Claude Code (~/.claude). Use --target codex or --target claude to limit the command.
|
|
168
196
|
|
|
169
|
-
|
|
170
|
-
${canonicalCliName}
|
|
197
|
+
Default:
|
|
198
|
+
${canonicalCliName} Installs and enables Codex, then installs Claude Code skill + agents (skill surfaces /goal-prep).
|
|
199
|
+
${canonicalCliName} --target claude Installs ${canonicalProductName} for Claude Code (skill + agents; skill surfaces /goal-prep).
|
|
200
|
+
${canonicalCliName} --target codex Installs and enables the native Codex plugin.
|
|
171
201
|
|
|
172
202
|
Compatibility:
|
|
173
203
|
${legacyCliName} remains a temporary alias and prints the new npx command for human-facing use.
|
|
174
204
|
|
|
175
205
|
Environment:
|
|
176
206
|
CODEX_HOME Overrides the default ~/.codex target.
|
|
207
|
+
CLAUDE_HOME Overrides the default ~/.claude target (and selects Claude Code unless --target codex is set).
|
|
177
208
|
GOALBUDDY_EXTEND_CATALOG_URL Overrides the default GitHub-hosted extension catalog.
|
|
178
209
|
GOAL_MAKER_EXTEND_CATALOG_URL Legacy fallback for the extension catalog.
|
|
179
210
|
`);
|
|
@@ -183,6 +214,255 @@ function codexHome() {
|
|
|
183
214
|
return resolve(optionValue("--codex-home") || defaultCodexHome);
|
|
184
215
|
}
|
|
185
216
|
|
|
217
|
+
function claudeHome() {
|
|
218
|
+
return resolve(optionValue("--claude-home") || defaultClaudeHome);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function targetMode() {
|
|
222
|
+
const value = (optionValue("--target") || "").toLowerCase();
|
|
223
|
+
if (value === "codex" || value === "claude") return value;
|
|
224
|
+
// Explicit --claude-home or CLAUDE_HOME implies Claude target unless --target codex is set.
|
|
225
|
+
if (optionValue("--claude-home") || process.env.CLAUDE_HOME) return "claude";
|
|
226
|
+
return "codex";
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function installTargetMode() {
|
|
230
|
+
const value = (optionValue("--target") || "").toLowerCase();
|
|
231
|
+
if (value === "codex" || value === "claude") return value;
|
|
232
|
+
|
|
233
|
+
const hasCodexHomeOption = Boolean(optionValue("--codex-home"));
|
|
234
|
+
const hasClaudeHomeOption = Boolean(optionValue("--claude-home"));
|
|
235
|
+
if (hasCodexHomeOption && !hasClaudeHomeOption) return "codex";
|
|
236
|
+
if (hasClaudeHomeOption && !hasCodexHomeOption) return "claude";
|
|
237
|
+
if (process.env.CLAUDE_HOME && !hasCodexHomeOption) return "claude";
|
|
238
|
+
return "all";
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function claudeSkillRoot() {
|
|
242
|
+
return join(claudeHome(), "skills", canonicalSkillDirectory);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function claudeAgentsRoot() {
|
|
246
|
+
return join(claudeHome(), "agents");
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function legacyClaudeCommandPath() {
|
|
250
|
+
return join(claudeHome(), "commands", "goal-prep.md");
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function installClaudeSkill({ quiet = false } = {}) {
|
|
254
|
+
const target = claudeSkillRoot();
|
|
255
|
+
if (!existsSync(skillSource)) {
|
|
256
|
+
console.error(`Skill payload not found: ${skillSource}`);
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const previousMetadata = readInstallMetadata(target);
|
|
261
|
+
const previousFingerprint = existsSync(target) ? directoryFingerprint(target, { exclude: installFingerprintExcludes() }) : "";
|
|
262
|
+
const preservedExtensions = preserveInstalledExtensions([target], { tempRoot: claudeHome() });
|
|
263
|
+
const extensionTempPath = preservedExtensions.tempPath;
|
|
264
|
+
const preservedExtensionIds = preservedExtensions.ids;
|
|
265
|
+
|
|
266
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
267
|
+
rmSync(target, { recursive: true, force: true });
|
|
268
|
+
cpSync(skillSource, target, { recursive: true });
|
|
269
|
+
restoreInstalledExtensions(target, extensionTempPath);
|
|
270
|
+
writeInstallMetadata(target, previousMetadata);
|
|
271
|
+
cleanupPreservedExtensions([extensionTempPath]);
|
|
272
|
+
|
|
273
|
+
const currentFingerprint = directoryFingerprint(target, { exclude: installFingerprintExcludes() });
|
|
274
|
+
const status = previousFingerprint
|
|
275
|
+
? previousFingerprint === currentFingerprint ? "unchanged" : "updated"
|
|
276
|
+
: "installed";
|
|
277
|
+
if (!quiet) console.log(`Installed Claude Code ${canonicalProductName} skill to ${target}`);
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
status,
|
|
281
|
+
path: target,
|
|
282
|
+
previous_version: previousMetadata?.package_version || "",
|
|
283
|
+
current_version: packageInfo.version,
|
|
284
|
+
preserved_extensions: preservedExtensionIds,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function installClaudeAgents({ quiet = false } = {}) {
|
|
289
|
+
const source = join(claudePluginSource, "agents");
|
|
290
|
+
const target = claudeAgentsRoot();
|
|
291
|
+
const force = hasFlag("--force") || command === "update" || command === "install" || command === "default";
|
|
292
|
+
mkdirSync(target, { recursive: true });
|
|
293
|
+
|
|
294
|
+
const results = [];
|
|
295
|
+
if (!existsSync(source)) return results;
|
|
296
|
+
for (const file of readdirSync(source)) {
|
|
297
|
+
if (!file.endsWith(".md")) continue;
|
|
298
|
+
const dest = join(target, file);
|
|
299
|
+
const sourceHash = sha256(readFileSync(join(source, file)));
|
|
300
|
+
const previousHash = existsSync(dest) ? sha256(readFileSync(dest)) : "";
|
|
301
|
+
if (existsSync(dest) && !force) {
|
|
302
|
+
if (!quiet) console.log(`skip existing ${dest} (use --force to overwrite)`);
|
|
303
|
+
results.push({ file, status: "skipped", path: dest });
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
cpSync(join(source, file), dest);
|
|
307
|
+
const status = previousHash ? previousHash === sourceHash ? "unchanged" : "updated" : "installed";
|
|
308
|
+
if (!quiet) console.log(`installed ${dest}`);
|
|
309
|
+
results.push({ file, status, path: dest });
|
|
310
|
+
}
|
|
311
|
+
return results;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function cleanupLegacyClaudeCommands({ quiet = false } = {}) {
|
|
315
|
+
const legacyPath = legacyClaudeCommandPath();
|
|
316
|
+
if (!existsSync(legacyPath)) return { removed: false, path: legacyPath };
|
|
317
|
+
rmSync(legacyPath, { force: true });
|
|
318
|
+
if (!quiet) console.log(`removed legacy ${legacyPath} (skill now surfaces /goal-prep)`);
|
|
319
|
+
return { removed: true, path: legacyPath };
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async function buildClaudeInstallReport() {
|
|
323
|
+
const quiet = true;
|
|
324
|
+
const report = {
|
|
325
|
+
command,
|
|
326
|
+
target: "claude",
|
|
327
|
+
package: {
|
|
328
|
+
name: packageInfo.name,
|
|
329
|
+
current_version: packageInfo.version,
|
|
330
|
+
},
|
|
331
|
+
claude_home: claudeHome(),
|
|
332
|
+
skill: installClaudeSkill({ quiet }),
|
|
333
|
+
agents: installClaudeAgents({ quiet }),
|
|
334
|
+
legacy_commands_cleanup: cleanupLegacyClaudeCommands({ quiet }),
|
|
335
|
+
extensions: await extensionDiscoverySummary(),
|
|
336
|
+
warnings: [],
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
report.package.previous_version = report.skill.previous_version;
|
|
340
|
+
return report;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async function installClaudeAll() {
|
|
344
|
+
const report = await buildClaudeInstallReport();
|
|
345
|
+
|
|
346
|
+
if (hasFlag("--json")) {
|
|
347
|
+
printJson(report);
|
|
348
|
+
} else {
|
|
349
|
+
printClaudeInstallReport(report);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async function installEverywhere() {
|
|
354
|
+
const report = {
|
|
355
|
+
command,
|
|
356
|
+
package: {
|
|
357
|
+
name: packageInfo.name,
|
|
358
|
+
current_version: packageInfo.version,
|
|
359
|
+
},
|
|
360
|
+
codex: null,
|
|
361
|
+
claude: null,
|
|
362
|
+
errors: [],
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
try {
|
|
366
|
+
report.codex = installPlugin({ quiet: true });
|
|
367
|
+
} catch (error) {
|
|
368
|
+
report.errors.push({ target: "codex", error: error.message });
|
|
369
|
+
report.codex = { target: "codex", ok: false, error: error.message };
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
try {
|
|
373
|
+
report.claude = await buildClaudeInstallReport();
|
|
374
|
+
} catch (error) {
|
|
375
|
+
report.errors.push({ target: "claude", error: error.message });
|
|
376
|
+
report.claude = { target: "claude", ok: false, error: error.message };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
report.ok = report.errors.length === 0;
|
|
380
|
+
|
|
381
|
+
if (hasFlag("--json")) {
|
|
382
|
+
printJson(report);
|
|
383
|
+
} else {
|
|
384
|
+
printEverywhereInstallReport(report);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
if (!report.ok) process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function doctorClaude() {
|
|
391
|
+
const skillPath = join(claudeSkillRoot(), "SKILL.md");
|
|
392
|
+
const agentsPath = claudeAgentsRoot();
|
|
393
|
+
const installed = existsSync(skillPath);
|
|
394
|
+
const agents = existsSync(agentsPath)
|
|
395
|
+
? readdirSync(agentsPath).filter((file) => file.startsWith("goal-") && file.endsWith(".md"))
|
|
396
|
+
: [];
|
|
397
|
+
const missingAgents = requiredClaudeAgentFiles.filter((file) => !agents.includes(file));
|
|
398
|
+
const staleAgents = requiredClaudeAgentFiles.filter((file) => {
|
|
399
|
+
const installedAgent = join(agentsPath, file);
|
|
400
|
+
const bundledAgent = join(claudePluginSource, "agents", file);
|
|
401
|
+
if (!existsSync(installedAgent) || !existsSync(bundledAgent)) return false;
|
|
402
|
+
return sha256(readFileSync(installedAgent)) !== sha256(readFileSync(bundledAgent));
|
|
403
|
+
});
|
|
404
|
+
const legacyCommandPath = legacyClaudeCommandPath();
|
|
405
|
+
const legacyCommandPresent = existsSync(legacyCommandPath);
|
|
406
|
+
|
|
407
|
+
console.log(JSON.stringify({
|
|
408
|
+
target: "claude",
|
|
409
|
+
claude_home: claudeHome(),
|
|
410
|
+
skill_installed: installed,
|
|
411
|
+
skill_path: skillPath,
|
|
412
|
+
installed_agents: agents,
|
|
413
|
+
missing_agents: missingAgents,
|
|
414
|
+
stale_agents: staleAgents,
|
|
415
|
+
legacy_command_present: legacyCommandPresent,
|
|
416
|
+
legacy_command_path: legacyCommandPath,
|
|
417
|
+
}, null, 2));
|
|
418
|
+
|
|
419
|
+
const installOk = installed && missingAgents.length === 0 && staleAgents.length === 0 && !legacyCommandPresent;
|
|
420
|
+
process.exit(installOk ? 0 : 1);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function printClaudeInstallReport(report) {
|
|
424
|
+
const verb = report.command === "update" ? "Updated" : "Installed";
|
|
425
|
+
const previous = report.package.previous_version && report.package.previous_version !== report.package.current_version
|
|
426
|
+
? ` ${report.package.previous_version} -> ${report.package.current_version}`
|
|
427
|
+
: ` ${report.package.current_version}`;
|
|
428
|
+
console.log("");
|
|
429
|
+
console.log(`${verb} ${canonicalProductName} for Claude Code${previous}`);
|
|
430
|
+
console.log("");
|
|
431
|
+
console.log(`Skill: ${report.skill.status} at ${report.skill.path}`);
|
|
432
|
+
console.log(`Agents: ${summarizeStatuses(report.agents)}`);
|
|
433
|
+
if (report.legacy_commands_cleanup?.removed) {
|
|
434
|
+
console.log(`Removed legacy command: ${report.legacy_commands_cleanup.path}`);
|
|
435
|
+
}
|
|
436
|
+
if (report.skill.preserved_extensions.length) {
|
|
437
|
+
console.log(`Preserved extensions: ${report.skill.preserved_extensions.join(", ")}`);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (report.extensions?.error) {
|
|
441
|
+
console.log("");
|
|
442
|
+
console.log(`Extensions: unavailable (${report.extensions.error})`);
|
|
443
|
+
} else if (report.extensions) {
|
|
444
|
+
console.log("");
|
|
445
|
+
console.log(`Extensions: ${report.extensions.available_count} available from ${report.extensions.catalog_url}`);
|
|
446
|
+
if (report.extensions.recommended?.length) {
|
|
447
|
+
console.log("");
|
|
448
|
+
console.log("Recommended:");
|
|
449
|
+
for (const extension of report.extensions.recommended.slice(0, 3)) {
|
|
450
|
+
console.log(` ${extension.name || extension.id}`);
|
|
451
|
+
if (extension.summary) console.log(` ${extension.summary}`);
|
|
452
|
+
console.log(` Details: npx ${extension.next_command}`);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
console.log("");
|
|
458
|
+
console.log("Next:");
|
|
459
|
+
console.log(` Restart Claude Code, then run: /goal-prep`);
|
|
460
|
+
console.log(` Or invoke the skill: ${canonicalSkillName}`);
|
|
461
|
+
console.log("");
|
|
462
|
+
console.log("Also available for Codex:");
|
|
463
|
+
console.log(` npx ${canonicalCliName} --target codex`);
|
|
464
|
+
}
|
|
465
|
+
|
|
186
466
|
function installSkill({ force = true, quiet = false } = {}) {
|
|
187
467
|
const target = installedSkillRoot();
|
|
188
468
|
const legacyTarget = legacyInstalledSkillRoot();
|
|
@@ -193,7 +473,7 @@ function installSkill({ force = true, quiet = false } = {}) {
|
|
|
193
473
|
|
|
194
474
|
const previousMetadata = readInstallMetadata(target) || readInstallMetadata(legacyTarget);
|
|
195
475
|
const previousFingerprint = existsSync(target) ? directoryFingerprint(target, { exclude: installFingerprintExcludes() }) : "";
|
|
196
|
-
const preservedExtensions = preserveInstalledExtensions([target, legacyTarget]);
|
|
476
|
+
const preservedExtensions = preserveInstalledExtensions([target, legacyTarget], { tempRoot: codexHome() });
|
|
197
477
|
const extensionTempPath = preservedExtensions.tempPath;
|
|
198
478
|
const preservedExtensionIds = preservedExtensions.ids;
|
|
199
479
|
|
|
@@ -417,7 +697,7 @@ Default source:
|
|
|
417
697
|
`);
|
|
418
698
|
}
|
|
419
699
|
|
|
420
|
-
function installPlugin() {
|
|
700
|
+
function installPlugin({ quiet = false } = {}) {
|
|
421
701
|
const source = optionValue("--source") || "tolibear/goalbuddy";
|
|
422
702
|
const pluginSource = join(packageRoot, "plugins", pluginName);
|
|
423
703
|
const pluginManifestPath = join(pluginSource, ".codex-plugin", "plugin.json");
|
|
@@ -427,35 +707,47 @@ function installPlugin() {
|
|
|
427
707
|
|
|
428
708
|
const pluginManifest = JSON.parse(readFileSync(pluginManifestPath, "utf8"));
|
|
429
709
|
const pluginCachePath = pluginCacheRoot(pluginManifest.version);
|
|
710
|
+
const pluginSkillPath = join(pluginCachePath, "skills", canonicalSkillDirectory);
|
|
430
711
|
const marketplace = runCodex(["plugin", "marketplace", "add", source]);
|
|
431
712
|
if (!marketplace.ok) {
|
|
432
713
|
throw new Error(`Failed to add Codex plugin marketplace: ${firstLine(marketplace.stderr || marketplace.stdout)}`);
|
|
433
714
|
}
|
|
434
715
|
|
|
716
|
+
const existingPluginSkillPath = installedPluginSkillRoot();
|
|
717
|
+
const preservedExtensions = preserveInstalledExtensions([existingPluginSkillPath], { tempRoot: dirname(pluginCachePath) });
|
|
435
718
|
mkdirSync(dirname(pluginCachePath), { recursive: true });
|
|
436
719
|
rmSync(pluginCachePath, { recursive: true, force: true });
|
|
437
720
|
cpSync(pluginSource, pluginCachePath, { recursive: true });
|
|
721
|
+
restoreInstalledExtensions(pluginSkillPath, preservedExtensions.tempPath);
|
|
722
|
+
cleanupPreservedExtensions([preservedExtensions.tempPath]);
|
|
438
723
|
const configPath = enablePluginConfig();
|
|
439
724
|
|
|
440
725
|
const report = {
|
|
441
726
|
installed: true,
|
|
727
|
+
target: "codex",
|
|
442
728
|
plugin: `${pluginName}@${pluginName}`,
|
|
443
729
|
version: pluginManifest.version,
|
|
444
730
|
codex_home: codexHome(),
|
|
445
731
|
marketplace_source: source,
|
|
446
732
|
cache_path: pluginCachePath,
|
|
447
733
|
config_path: configPath,
|
|
734
|
+
preserved_extensions: preservedExtensions.ids,
|
|
448
735
|
};
|
|
449
736
|
|
|
450
|
-
if (hasFlag("--json")) {
|
|
737
|
+
if (hasFlag("--json") && !quiet) {
|
|
451
738
|
printJson(report);
|
|
452
|
-
return;
|
|
739
|
+
return report;
|
|
453
740
|
}
|
|
454
741
|
|
|
742
|
+
if (quiet) return report;
|
|
743
|
+
|
|
455
744
|
console.log(`Installed ${canonicalProductName} Codex plugin ${pluginManifest.version}`);
|
|
456
745
|
console.log(`Marketplace: ${source}`);
|
|
457
746
|
console.log(`Cache: ${pluginCachePath}`);
|
|
458
747
|
console.log(`Config: ${configPath}`);
|
|
748
|
+
if (report.preserved_extensions.length) {
|
|
749
|
+
console.log(`Preserved extensions: ${report.preserved_extensions.join(", ")}`);
|
|
750
|
+
}
|
|
459
751
|
console.log("");
|
|
460
752
|
console.log("Restart Codex, then use:");
|
|
461
753
|
console.log(` $${canonicalSkillName}`);
|
|
@@ -463,6 +755,7 @@ function installPlugin() {
|
|
|
463
755
|
console.log("Bundled visual boards:");
|
|
464
756
|
console.log(` npx ${canonicalCliName} board docs/goals/<slug>`);
|
|
465
757
|
console.log(` npx ${canonicalCliName} extend github-projects`);
|
|
758
|
+
return report;
|
|
466
759
|
}
|
|
467
760
|
|
|
468
761
|
function pluginCacheRoot(version) {
|
|
@@ -1101,11 +1394,13 @@ function listFiles(root, { exclude = new Set(), prefix = "" } = {}) {
|
|
|
1101
1394
|
return files;
|
|
1102
1395
|
}
|
|
1103
1396
|
|
|
1104
|
-
function preserveInstalledExtensions(targets) {
|
|
1397
|
+
function preserveInstalledExtensions(targets, { tempRoot = "" } = {}) {
|
|
1105
1398
|
const ids = [];
|
|
1106
|
-
const
|
|
1399
|
+
const firstTarget = targets.find(Boolean) || codexHome();
|
|
1400
|
+
const tempPath = join(tempRoot || dirname(dirname(firstTarget)), `.goalbuddy-preserved-extend-${process.pid}-${Date.now()}`);
|
|
1107
1401
|
let hasExtensions = false;
|
|
1108
1402
|
for (const target of targets) {
|
|
1403
|
+
if (!target) continue;
|
|
1109
1404
|
const source = join(target, "extend");
|
|
1110
1405
|
if (!existsSync(source)) continue;
|
|
1111
1406
|
mkdirSync(tempPath, { recursive: true });
|
|
@@ -1261,6 +1556,43 @@ function printInstallReport(report) {
|
|
|
1261
1556
|
console.log(` ${legacyCliName} remains a temporary compatibility alias.`);
|
|
1262
1557
|
}
|
|
1263
1558
|
|
|
1559
|
+
function printEverywhereInstallReport(report) {
|
|
1560
|
+
const verb = report.command === "update" ? "Updated" : "Installed";
|
|
1561
|
+
console.log("");
|
|
1562
|
+
console.log(`${verb} ${canonicalProductName} for Codex and Claude Code ${report.package.current_version}`);
|
|
1563
|
+
console.log("");
|
|
1564
|
+
|
|
1565
|
+
if (report.codex?.ok === false) {
|
|
1566
|
+
console.log(`Codex: not completed (${report.codex.error})`);
|
|
1567
|
+
} else if (report.codex) {
|
|
1568
|
+
console.log(`Codex: plugin ${report.codex.version} enabled at ${report.codex.cache_path}`);
|
|
1569
|
+
if (report.codex.preserved_extensions?.length) {
|
|
1570
|
+
console.log(`Codex preserved extensions: ${report.codex.preserved_extensions.join(", ")}`);
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
if (report.claude?.ok === false) {
|
|
1575
|
+
console.log(`Claude Code: not completed (${report.claude.error})`);
|
|
1576
|
+
} else if (report.claude) {
|
|
1577
|
+
console.log(`Claude Code: skill ${report.claude.skill.status} at ${report.claude.skill.path}`);
|
|
1578
|
+
console.log(`Claude Code agents: ${summarizeStatuses(report.claude.agents)}`);
|
|
1579
|
+
if (report.claude.legacy_commands_cleanup?.removed) {
|
|
1580
|
+
console.log(`Claude Code: removed legacy command at ${report.claude.legacy_commands_cleanup.path}`);
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1584
|
+
if (report.errors.length) {
|
|
1585
|
+
console.log("");
|
|
1586
|
+
console.log("One or more targets need attention:");
|
|
1587
|
+
for (const error of report.errors) console.log(` ${error.target}: ${error.error}`);
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
console.log("");
|
|
1591
|
+
console.log("Next:");
|
|
1592
|
+
console.log(` Restart Codex, then use: $${canonicalSkillName}`);
|
|
1593
|
+
console.log(" Restart Claude Code, then run: /goal-prep");
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1264
1596
|
function summarizeStatuses(items) {
|
|
1265
1597
|
const counts = items.reduce((memo, item) => {
|
|
1266
1598
|
memo[item.status] = (memo[item.status] || 0) + 1;
|
|
@@ -12,7 +12,7 @@ if (!globalInstall || process.env.GOALBUDDY_SKIP_POSTINSTALL) {
|
|
|
12
12
|
process.exit(0);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
const result = spawnSync(process.execPath, [cliPath
|
|
15
|
+
const result = spawnSync(process.execPath, [cliPath], {
|
|
16
16
|
encoding: "utf8",
|
|
17
17
|
env: process.env,
|
|
18
18
|
stdio: "inherit",
|
|
@@ -23,7 +23,7 @@ if (result.status === 0) {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
console.error("");
|
|
26
|
-
console.error("GoalBuddy installed globally, but
|
|
27
|
-
console.error("Run this after Codex
|
|
26
|
+
console.error("GoalBuddy installed globally, but setup did not complete for every target.");
|
|
27
|
+
console.error("Run this after Codex and Claude Code are available:");
|
|
28
28
|
console.error(" goalbuddy");
|
|
29
29
|
process.exit(0);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "goalbuddy",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "A /goal operating system for Codex and Claude Code: Scout/Judge/Worker boards with visual board surfaces, receipts, and verification.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"goalbuddy": "internal/cli/goal-maker.mjs",
|
|
@@ -37,6 +37,10 @@
|
|
|
37
37
|
"codex",
|
|
38
38
|
"codex-skill",
|
|
39
39
|
"openai-codex",
|
|
40
|
+
"claude-code",
|
|
41
|
+
"claude-code-plugin",
|
|
42
|
+
"claude-code-skill",
|
|
43
|
+
"anthropic",
|
|
40
44
|
"goalbuddy",
|
|
41
45
|
"goal",
|
|
42
46
|
"task-board",
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "goalbuddy",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Turn broad Claude Code work into verified GoalBuddy boards with Scout, Judge, Worker, visual boards, and receipts.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tolibear",
|
|
7
|
+
"email": "support@tolibear.com",
|
|
8
|
+
"url": "https://github.com/tolibear"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://goalbuddy.dev",
|
|
11
|
+
"repository": "https://github.com/tolibear/goalbuddy",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"claude-code",
|
|
15
|
+
"claude-code-plugin",
|
|
16
|
+
"claude-code-skill",
|
|
17
|
+
"goalbuddy",
|
|
18
|
+
"goal",
|
|
19
|
+
"task-board",
|
|
20
|
+
"receipts",
|
|
21
|
+
"workflow",
|
|
22
|
+
"extensions"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "goalbuddy",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Turn broad Codex work into verified GoalBuddy boards with Scout, Judge, Worker, visual boards, and receipts.",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Turn broad Codex and Claude Code work into verified GoalBuddy boards with Scout, Judge, Worker, visual boards, and receipts.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "tolibear",
|
|
7
7
|
"email": "support@tolibear.com",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"keywords": [
|
|
14
14
|
"goalbuddy",
|
|
15
15
|
"codex",
|
|
16
|
+
"claude-code",
|
|
16
17
|
"skills",
|
|
17
18
|
"goal",
|
|
18
19
|
"task-board",
|
|
@@ -23,8 +24,8 @@
|
|
|
23
24
|
"skills": "./skills/",
|
|
24
25
|
"interface": {
|
|
25
26
|
"displayName": "GoalBuddy",
|
|
26
|
-
"shortDescription": "Turn broad Codex work into verified Scout/Judge/Worker boards",
|
|
27
|
-
"longDescription": "GoalBuddy packages a structured
|
|
27
|
+
"shortDescription": "Turn broad Codex or Claude Code work into verified Scout/Judge/Worker boards",
|
|
28
|
+
"longDescription": "GoalBuddy packages a structured goal workflow for broad, long-running, or ambiguous engineering work in Codex or Claude Code. It creates durable goal charters, task boards, visual board surfaces, receipts, verification gates, extension handoffs, and compatibility guidance for teams moving from goal-maker.",
|
|
28
29
|
"developerName": "tolibear",
|
|
29
30
|
"category": "Coding",
|
|
30
31
|
"capabilities": [
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
# GoalBuddy Codex
|
|
1
|
+
# GoalBuddy Plugin (Codex + Claude Code)
|
|
2
2
|
|
|
3
|
-
GoalBuddy packages the canonical
|
|
3
|
+
GoalBuddy packages the canonical `goal-prep` skill as a plugin so teams can install the reusable workflow in **Codex** and **Claude Code**, while keeping the npm CLI for local setup, doctor checks, and extension management.
|
|
4
4
|
|
|
5
5
|
## What It Contains
|
|
6
6
|
|
|
7
|
-
- `.codex-plugin/plugin.json`: plugin
|
|
8
|
-
-
|
|
7
|
+
- `.codex-plugin/plugin.json`: Codex plugin manifest and Codex UI copy.
|
|
8
|
+
- `.claude-plugin/plugin.json`: Claude Code plugin manifest.
|
|
9
|
+
- `skills/goalbuddy/`: the installable GoalBuddy skill payload (shared by both platforms).
|
|
10
|
+
- `agents/`: Claude Code subagent definitions (`goal-scout.md`, `goal-judge.md`, `goal-worker.md`).
|
|
11
|
+
- `commands/goal-prep.md`: Claude Code slash command entry point.
|
|
9
12
|
- `assets/goalbuddy-icon.svg`: lightweight plugin icon.
|
|
10
13
|
|
|
11
14
|
## Local Testing
|
|
@@ -18,25 +21,36 @@ npx goalbuddy doctor
|
|
|
18
21
|
npx goalbuddy check-update
|
|
19
22
|
```
|
|
20
23
|
|
|
21
|
-
##
|
|
22
|
-
|
|
23
|
-
Install and enable GoalBuddy:
|
|
24
|
+
## Install Both Targets
|
|
24
25
|
|
|
25
26
|
```bash
|
|
26
27
|
npx goalbuddy
|
|
27
28
|
```
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
This installs and enables the native Codex plugin in `~/.codex/`, then installs the GoalBuddy skill, Scout/Judge/Worker subagents, and `/goal-prep` slash command into `~/.claude/`.
|
|
31
|
+
|
|
32
|
+
## Install One Target
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx goalbuddy --target codex
|
|
36
|
+
npx goalbuddy --target claude
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
This installs the GoalBuddy skill, the three Scout/Judge/Worker subagents, and the `/goal-prep` slash command into `~/.claude/`. Restart Claude Code, then run:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
/goal-prep
|
|
43
|
+
```
|
|
30
44
|
|
|
31
45
|
Or install the npm package globally:
|
|
32
46
|
|
|
33
47
|
```bash
|
|
34
48
|
npm i -g goalbuddy
|
|
35
|
-
goalbuddy
|
|
49
|
+
goalbuddy # installs for Codex and Claude Code
|
|
50
|
+
goalbuddy --target codex # installs for Codex only
|
|
51
|
+
goalbuddy --target claude # installs for Claude Code only
|
|
36
52
|
```
|
|
37
53
|
|
|
38
|
-
The marketplace manifest is included for Codex discovery, but current Codex CLI builds only register the marketplace with `codex plugin marketplace add`; the npm CLI also caches and enables the plugin.
|
|
39
|
-
|
|
40
54
|
For local CLI testing before npm publish:
|
|
41
55
|
|
|
42
56
|
```bash
|
|
@@ -46,4 +60,4 @@ node internal/cli/goal-maker.mjs doctor
|
|
|
46
60
|
|
|
47
61
|
## Release Notes
|
|
48
62
|
|
|
49
|
-
The plugin is prepared for the `tolibear/goalbuddy` repo and `goalbuddy` npm package. Keep `.codex-plugin/plugin.json` aligned with `package.json` before publishing a new package release.
|
|
63
|
+
The plugin is prepared for the `tolibear/goalbuddy` repo and `goalbuddy` npm package. Keep `.codex-plugin/plugin.json` and `.claude-plugin/plugin.json` aligned with `package.json` before publishing a new package release.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: goal-judge
|
|
3
|
+
description: GoalBuddy Judge. High-thinking strategic reviewer for GoalBuddy escalation: ambiguity, risky scope, source/product conflicts, safety/API/live decisions, and tranche completion. Returns a compact Judge receipt for the PM to paste into state.yaml.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are Judge for GoalBuddy.
|
|
8
|
+
|
|
9
|
+
Thinking level: high.
|
|
10
|
+
Mode: strategic reviewer and escalation authority.
|
|
11
|
+
|
|
12
|
+
Think as a skeptical staff engineer and project-management systems designer. You decide and constrain; you do not broadly implement.
|
|
13
|
+
|
|
14
|
+
Use when source, tests, product behavior, API/live strategy, dirty scope, giant-file risk, safety/auth/money/persistence semantics, task priority, or completion readiness is ambiguous.
|
|
15
|
+
|
|
16
|
+
Do not approve based on lots of docs or lots of tests. Require coherent receipts and current verification.
|
|
17
|
+
|
|
18
|
+
Return a compact Judge receipt for the PM to paste into state.yaml:
|
|
19
|
+
- result
|
|
20
|
+
- decision
|
|
21
|
+
- evidence
|
|
22
|
+
- next_allowed_task when work may continue
|
|
23
|
+
- blocked_tasks when work should not proceed
|
|
24
|
+
- completion decision when auditing a tranche
|
|
25
|
+
- required board updates
|
|
26
|
+
|
|
27
|
+
Do not broadly implement, select the active task, or mark the goal complete yourself.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: goal-scout
|
|
3
|
+
description: GoalBuddy Scout. Read-only evidence mapper for one GoalBuddy task. Finds repo/source/spec evidence, verification commands, ambiguities, and candidate next tasks. Returns a compact Scout receipt for the PM to paste into state.yaml.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are Scout for GoalBuddy.
|
|
8
|
+
|
|
9
|
+
Thinking level: medium.
|
|
10
|
+
Mode: read-only evidence mapping.
|
|
11
|
+
|
|
12
|
+
You are read-only. Do not edit files, stage files, run destructive commands, or claim implementation is complete.
|
|
13
|
+
|
|
14
|
+
Given one active Scout task, map repo/source/spec evidence, verification commands, health signals, improvement candidates, target files, tests, and unresolved ambiguity.
|
|
15
|
+
|
|
16
|
+
Return a compact Scout receipt for the PM to paste into state.yaml:
|
|
17
|
+
- result
|
|
18
|
+
- summary
|
|
19
|
+
- evidence paths
|
|
20
|
+
- note path if findings are too large for the task card
|
|
21
|
+
- spawned_tasks when useful
|
|
22
|
+
- ambiguity requiring Judge
|
|
23
|
+
|
|
24
|
+
Do not select the active task or mark the goal complete.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: goal-worker
|
|
3
|
+
description: GoalBuddy Worker. Low-thinking bounded implementer for exactly one GoalBuddy Worker task with allowed files, verification commands, and stop conditions. Returns a compact Worker receipt for the PM to paste into state.yaml.
|
|
4
|
+
tools: Read, Edit, Write, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are Worker for GoalBuddy.
|
|
8
|
+
|
|
9
|
+
Thinking level: low.
|
|
10
|
+
Mode: one bounded writer.
|
|
11
|
+
|
|
12
|
+
Execute exactly one active Worker task. Do not broaden scope.
|
|
13
|
+
|
|
14
|
+
You may edit only the task's allowed_files. You may update only explicitly named control files if the PM included them in scope. Do not decide product behavior, retained/excluded scope, API/live/deployment strategy, architecture direction, parity, or completion readiness.
|
|
15
|
+
|
|
16
|
+
Stop immediately if required evidence is missing, files outside scope are needed, source/tests/product conflict, verification fails twice, or the diff exceeds the task budget.
|
|
17
|
+
|
|
18
|
+
Return a compact Worker receipt for the PM to paste into state.yaml:
|
|
19
|
+
- result
|
|
20
|
+
- changed_files
|
|
21
|
+
- commands run with pass/fail
|
|
22
|
+
- summary
|
|
23
|
+
- remaining_blockers
|
|
24
|
+
- needs_judge when strategy or ambiguity remains
|
|
25
|
+
|
|
26
|
+
Do not select the next active task or mark the goal complete.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: goal-prep
|
|
3
|
-
description: Goal Prep for GoalBuddy. Use for broad, long-running, stalled, vague, detailed, planned, or unhealthy Codex work that needs a structured /goal intake, autonomous task discovery, role-tagged Scout/Judge/Worker delegation, one active task, durable receipts, and a PM-owned rolling board that maximizes the chance of a successful goal run.
|
|
3
|
+
description: Goal Prep for GoalBuddy. Use for broad, long-running, stalled, vague, detailed, planned, or unhealthy Codex or Claude Code work that needs a structured /goal intake, autonomous task discovery, role-tagged Scout/Judge/Worker delegation, one active task, durable receipts, and a PM-owned rolling board that maximizes the chance of a successful goal run.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Goal Prep
|
|
7
7
|
|
|
8
|
-
`$goal-prep` prepares a GoalBuddy board. It does not start `/goal` automatically, but the board and starter `/goal` command must be shaped so the next run continues into safe execution by default.
|
|
8
|
+
`$goal-prep` (Codex) or `/goal-prep` (Claude Code) prepares a GoalBuddy board. It does not start `/goal` automatically, but the board and starter `/goal` command must be shaped so the next run continues into safe execution by default.
|
|
9
9
|
|
|
10
|
-
GoalBuddy is for autonomous, long-running Codex work where the PM thread may need to discover the work, define tasks, sequence them, delegate them, execute them, verify them, and keep going without the human decomposing every step.
|
|
10
|
+
GoalBuddy is for autonomous, long-running Codex or Claude Code work where the PM thread may need to discover the work, define tasks, sequence them, delegate them, execute them, verify them, and keep going without the human decomposing every step.
|
|
11
11
|
|
|
12
12
|
The loop is:
|
|
13
13
|
|
|
@@ -81,11 +81,11 @@ Do you want to set up a visual board for this?
|
|
|
81
81
|
|
|
82
82
|
Recommended options:
|
|
83
83
|
|
|
84
|
-
1. Local live board
|
|
84
|
+
1. Local live board (Recommended) - starts immediately, requires no credentials, and lets the user watch tasks populate inside Codex or Claude Code.
|
|
85
85
|
2. GitHub Projects - best when stakeholders need a shared external board and the user can approve GitHub credentials/project details.
|
|
86
86
|
3. No visual board - best for quick or private goals where the file board is enough.
|
|
87
87
|
|
|
88
|
-
If the user chooses the local live board, create the goal directory, `notes/`, and an initial minimal `state.yaml` as soon as the slug is known, then run `npx goalbuddy board docs/goals/<slug>` and open the printed local URL in the Codex in-app Browser. In short: start the local board before filling the task list so the board pops up right away and cards populate live as `state.yaml` changes. Keep the printed URL in the final prep response as a fallback, but do not make the URL the primary experience.
|
|
88
|
+
If the user chooses the local live board, create the goal directory, `notes/`, and an initial minimal `state.yaml` as soon as the slug is known, then run `npx goalbuddy board docs/goals/<slug>` and open the printed local URL in the AI coding agent's in-app browser (the Codex in-app Browser, the Claude Code preview, or the user's regular browser). In short: start the local board before filling the task list so the board pops up right away and cards populate live as `state.yaml` changes. Keep the printed URL in the final prep response as a fallback, but do not make the URL the primary experience.
|
|
89
89
|
|
|
90
90
|
If the user chooses GitHub Projects, ask for approval and the required project target before any live write. Create or sync the GitHub Project at the same early point as the local board: after the goal root and skeleton `state.yaml` exist, before the detailed task list is finished, then sync again as tasks populate. Run a dry-run sync first when possible. Missing GitHub credentials or project details should not block local board creation or goal prep; record the missing requirement in `visual_board.github_projects` and seed a PM setup task.
|
|
91
91
|
|
|
@@ -138,11 +138,11 @@ Minimum diagnostic ladder for vague, strategic, or improvement-oriented goals:
|
|
|
138
138
|
2. Intent target: what kind of improvement or outcome matters most?
|
|
139
139
|
3. Success proof: what evidence would convince the user this worked?
|
|
140
140
|
4. Scope and non-goals: what should remain untouched or explicitly out of scope?
|
|
141
|
-
5.
|
|
141
|
+
5. Goal handling: reuse an existing goal, create a fresh goal, or inspect first?
|
|
142
142
|
|
|
143
143
|
Ask these one at a time. Skip a step only when the user's words already answer it clearly. After the user answers one step, do not assume the remaining steps; ask the next unresolved material question.
|
|
144
144
|
|
|
145
|
-
For "make GoalBuddy better", a good first question is which improvement target matters most: intake clarity, board/execution reliability, completion proof/eval coverage, or user experience during long-running goals. A good second question asks what proof would convince the user it improved. A good third question asks whether to reuse an existing
|
|
145
|
+
For "make GoalBuddy better", a good first question is which improvement target matters most: intake clarity, board/execution reliability, completion proof/eval coverage, or user experience during long-running goals. A good second question asks what proof would convince the user it improved. A good third question asks whether to reuse an existing goal, create a fresh goal, or inspect first.
|
|
146
146
|
|
|
147
147
|
## Direct `/goal` Entry
|
|
148
148
|
|
|
@@ -173,7 +173,7 @@ Do:
|
|
|
173
173
|
- classify the goal as `specific`, `open_ended`, `existing_plan`, `recovery`, or `audit`;
|
|
174
174
|
- create or repair `docs/goals/<slug>/`;
|
|
175
175
|
- create `goal.md`, `state.yaml`, and `notes/`;
|
|
176
|
-
- if requested, start the local visual board immediately and open it in the Codex in-app Browser before filling the task list;
|
|
176
|
+
- if requested, start the local visual board immediately and open it in the AI coding agent's in-app browser (Codex in-app Browser, Claude Code preview, or the user's regular browser) before filling the task list;
|
|
177
177
|
- seed a role-tagged task board that matches the input shape;
|
|
178
178
|
- make the first active task safe;
|
|
179
179
|
- verify Scout, Worker, and Judge agent availability or record an explicit truthful state;
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
# GoalBuddy Agents
|
|
2
2
|
|
|
3
|
-
This directory contains
|
|
3
|
+
This directory contains skill metadata and bundled agent definitions for Codex and Claude Code.
|
|
4
|
+
|
|
5
|
+
## Files
|
|
4
6
|
|
|
5
7
|
- `openai.yaml` stays with the skill as metadata.
|
|
6
|
-
- `
|
|
8
|
+
- `goal_scout.toml`, `goal_judge.toml`, `goal_worker.toml` — Codex agent configs. Copy into `.codex/agents/` for project-scoped agents or `~/.codex/agents/` for personal agents.
|
|
9
|
+
- Claude Code agent markdown lives in `plugins/goalbuddy/agents/` (installed to `~/.claude/agents/` by `npx goalbuddy --target claude`).
|
|
10
|
+
|
|
11
|
+
## Agent Matrix
|
|
7
12
|
|
|
8
|
-
| Agent |
|
|
9
|
-
|
|
10
|
-
| Scout | `goal_scout.toml` | medium | read-only |
|
|
11
|
-
| Worker | `goal_worker.toml` | low | workspace-write |
|
|
12
|
-
| Judge | `goal_judge.toml` | high | read-only |
|
|
13
|
+
| Agent | Codex file | Claude Code file | Reasoning effort | Write scope |
|
|
14
|
+
|---|---|---|---:|---|
|
|
15
|
+
| Scout | `goal_scout.toml` | `goal-scout.md` | medium | read-only |
|
|
16
|
+
| Worker | `goal_worker.toml` | `goal-worker.md` | low | workspace-write |
|
|
17
|
+
| Judge | `goal_judge.toml` | `goal-judge.md` | high | read-only |
|
|
13
18
|
|
|
14
|
-
Recommended
|
|
19
|
+
## Recommended Codex Config
|
|
15
20
|
|
|
16
21
|
```toml
|
|
17
22
|
[agents]
|
|
@@ -20,4 +25,6 @@ max_depth = 1
|
|
|
20
25
|
job_max_runtime_seconds = 1800
|
|
21
26
|
```
|
|
22
27
|
|
|
28
|
+
## Authority Boundary
|
|
29
|
+
|
|
23
30
|
Only the main `/goal` PM loop may select the active task, mark tasks done, update board truth, or mark the goal complete.
|