workbench-dashboard 0.1.3__py3-none-any.whl
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.
- workbench/__init__.py +3 -0
- workbench/__main__.py +3 -0
- workbench/agents/__init__.py +1 -0
- workbench/agents/assets/chat/LEARNING_PROMPT.md +67 -0
- workbench/agents/assets/chat/PROMPT.md +107 -0
- workbench/agents/assets/claude/workbench-review/SKILL.md +130 -0
- workbench/agents/assets/claude/workbench-update/SKILL.md +87 -0
- workbench/agents/assets/gemini/GEMINI.md +96 -0
- workbench/agents/assets/gemini/commands/workbench-review.toml +8 -0
- workbench/agents/assets/gemini/commands/workbench-update.toml +9 -0
- workbench/agents/hooks.py +388 -0
- workbench/agents/install.py +242 -0
- workbench/agents/updater.py +499 -0
- workbench/cli/__init__.py +48 -0
- workbench/cli/__main__.py +3 -0
- workbench/cli/_common.py +421 -0
- workbench/cli/agents.py +236 -0
- workbench/cli/demo.py +22 -0
- workbench/cli/discover.py +30 -0
- workbench/cli/hierarchy.py +275 -0
- workbench/cli/history.py +124 -0
- workbench/cli/items.py +170 -0
- workbench/cli/learning.py +113 -0
- workbench/cli/projects.py +522 -0
- workbench/cli/server.py +72 -0
- workbench/cli/setup.py +114 -0
- workbench/commitmsg.py +104 -0
- workbench/config.py +109 -0
- workbench/demo/__init__.py +13 -0
- workbench/demo/data/github_fixtures.yaml +58 -0
- workbench/demo/data/repos.yaml +67 -0
- workbench/demo/data/seed/learning/demo-control-theory/path.yaml +40 -0
- workbench/demo/data/seed/learning/demo-linear-algebra/path.yaml +51 -0
- workbench/demo/data/seed/learning/demo-robotics-kinematics/path.yaml +51 -0
- workbench/demo/data/seed/learning/demo-robotics-kinematics/topics/rigid-motions.md +6 -0
- workbench/demo/data/seed/learning/demo-signal-processing/path.yaml +77 -0
- workbench/demo/data/seed/learning/demo-signal-processing/topics/aliasing.md +6 -0
- workbench/demo/data/seed/learning/demo-signal-processing/topics/filters.md +6 -0
- workbench/demo/data/seed/learning/demo-signal-processing/topics/sampling.md +9 -0
- workbench/demo/data/seed/projects/demo-budget-cli/project.yaml +67 -0
- workbench/demo/data/seed/projects/demo-esp32-audio-dsp/project.yaml +71 -0
- workbench/demo/data/seed/projects/demo-fpga-logic-analyzer/project.yaml +62 -0
- workbench/demo/data/seed/projects/demo-home-lab-cluster/project.yaml +115 -0
- workbench/demo/data/seed/projects/demo-notes-sync/project.yaml +15 -0
- workbench/demo/data/seed/projects/demo-old-game/project.yaml +28 -0
- workbench/demo/data/seed/projects/demo-portfolio-site/project.yaml +55 -0
- workbench/demo/data/seed/projects/demo-robot-arm/project.yaml +200 -0
- workbench/demo/data/seed/projects/demo-weather-station/project.yaml +145 -0
- workbench/demo/data/seed/workbench.yaml +1 -0
- workbench/demo/environment.py +201 -0
- workbench/demo/fake_github.py +62 -0
- workbench/discovery/__init__.py +1 -0
- workbench/discovery/github.py +201 -0
- workbench/discovery/local.py +143 -0
- workbench/discovery/register.py +195 -0
- workbench/edits.py +498 -0
- workbench/gitops.py +276 -0
- workbench/identity.py +95 -0
- workbench/learning_md.py +171 -0
- workbench/models.py +292 -0
- workbench/privacy.py +310 -0
- workbench/semantic.py +193 -0
- workbench/server/__init__.py +1 -0
- workbench/server/app.py +351 -0
- workbench/server/sync.py +267 -0
- workbench/server/writes/__init__.py +52 -0
- workbench/server/writes/_transaction.py +196 -0
- workbench/server/writes/fields.py +198 -0
- workbench/server/writes/structure.py +299 -0
- workbench/server/writes/suggestions.py +59 -0
- workbench/validate.py +375 -0
- workbench/web_dist/apple-touch-icon.png +0 -0
- workbench/web_dist/assets/index-B-uZPmYA.js +78 -0
- workbench/web_dist/assets/index-C0Ywyco5.css +1 -0
- workbench/web_dist/favicon-32.png +0 -0
- workbench/web_dist/favicon.svg +9 -0
- workbench/web_dist/index.html +16 -0
- workbench/yamlio.py +63 -0
- workbench_dashboard-0.1.3.dist-info/METADATA +322 -0
- workbench_dashboard-0.1.3.dist-info/RECORD +83 -0
- workbench_dashboard-0.1.3.dist-info/WHEEL +4 -0
- workbench_dashboard-0.1.3.dist-info/entry_points.txt +2 -0
- workbench_dashboard-0.1.3.dist-info/licenses/LICENSE +21 -0
workbench/__init__.py
ADDED
workbench/__main__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Coding-agent integration: the Stop/AfterAgent hook, the headless updater, and the installer."""
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Workbench learning-path chat prompt
|
|
2
|
+
|
|
3
|
+
Paste everything below the line into the chat that holds what you have been learning. Replace the
|
|
4
|
+
CURRENT OUTLINE placeholder first:
|
|
5
|
+
|
|
6
|
+
- existing path: the output of `workbench learning export <path-id>`
|
|
7
|
+
- new path: `NEW: <Path Name>`
|
|
8
|
+
|
|
9
|
+
Save the reply's outline as a `.md` file and run `workbench learning import <file>.md`. Importing
|
|
10
|
+
into an existing path merges: statuses only move forward, and items missing from the outline are
|
|
11
|
+
kept, so progress marked on the dashboard is never lost.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
Turn what this conversation shows about my learning into a Workbench learning-path outline: what I
|
|
16
|
+
set out to learn, what I have covered, what I am partway through, and what is still left. The "still
|
|
17
|
+
left" part matters most; do not skip it.
|
|
18
|
+
|
|
19
|
+
CURRENT OUTLINE:
|
|
20
|
+
<paste `workbench learning export <path-id>` output here, or write NEW: <Path Name>>
|
|
21
|
+
|
|
22
|
+
Reply with exactly one ```markdown code block and nothing else — no text before or after it.
|
|
23
|
+
|
|
24
|
+
FORMAT:
|
|
25
|
+
|
|
26
|
+
```markdown
|
|
27
|
+
# Control Theory
|
|
28
|
+
Feedback control from first principles, aimed at steering a field robot along crop rows.
|
|
29
|
+
- [Feedback Systems by Astrom and Murray](https://fbswiki.org/wiki/index.php/Main_Page)
|
|
30
|
+
|
|
31
|
+
## [x] Linear systems
|
|
32
|
+
State-space models and what decides whether a system settles.
|
|
33
|
+
|
|
34
|
+
### [x] State-space models
|
|
35
|
+
Writing dynamics as x' = Ax + Bu.
|
|
36
|
+
|
|
37
|
+
### [~] Stability and eigenvalues
|
|
38
|
+
Eigenvalues of A in the left half-plane mean the system settles.
|
|
39
|
+
|
|
40
|
+
## [ ] PID control
|
|
41
|
+
The controller used on the robot's steering loop.
|
|
42
|
+
|
|
43
|
+
### [ ] Tuning
|
|
44
|
+
Choosing gains from a step response.
|
|
45
|
+
|
|
46
|
+
### [ ] Anti-windup
|
|
47
|
+
Stopping the integral term from growing while the actuator is saturated.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
RULES:
|
|
51
|
+
|
|
52
|
+
1. Structure: one `#` line with the path name, then `##` topics, each with `###` subtopics. Nothing
|
|
53
|
+
deeper than `###`.
|
|
54
|
+
2. Status marker right after the hashes on every `##` and `###` line: `[x]` covered and understood,
|
|
55
|
+
`[~]` started but not finished, `[ ]` not started. Mark `[x]` only when the conversation shows I
|
|
56
|
+
actually worked through it.
|
|
57
|
+
3. Keep every topic and subtopic from CURRENT OUTLINE with exactly the same heading text, including
|
|
58
|
+
any `{#id}` at the end of a heading. You may change its marker and summary, and add new items.
|
|
59
|
+
Never rename or remove one.
|
|
60
|
+
4. Still left → `[ ]` items: what I said I want to learn next, prerequisites we found I am missing,
|
|
61
|
+
and topics we deferred. Do not add topics I did not ask for or agree to.
|
|
62
|
+
5. Under any heading you may add one line of summary (≤300 characters; under `#`, ≤500) and links as
|
|
63
|
+
`- [Label](https://...)` lines. Labels ≤40 characters; only `https://` links. Leave them out if
|
|
64
|
+
you have nothing real to put there — never invent a link.
|
|
65
|
+
6. Heading names ≤80 characters. Two items must not have the same name.
|
|
66
|
+
7. Never include secrets, passwords, local file paths, email addresses, or personal information.
|
|
67
|
+
8. If something is unclear from the conversation, leave it out instead of guessing.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Workbench chat prompt
|
|
2
|
+
|
|
3
|
+
Paste everything below the line into the chat that holds the project's history (claude.ai, the
|
|
4
|
+
desktop app, or any other assistant). Replace the CURRENT ENTRY placeholder first:
|
|
5
|
+
|
|
6
|
+
- existing project: the output of `workbench show --id <project-id>`
|
|
7
|
+
- new project: `NEW: <Project Name>`
|
|
8
|
+
|
|
9
|
+
Then put the reply into Workbench with `workbench begin --id <project-id>`: replace the printed
|
|
10
|
+
`project.yaml` with the reply's YAML and run `workbench push <worktree> -m "<summary>"`. Push
|
|
11
|
+
validates the format, scans for private data, and refuses removed ids.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
Update my Workbench dashboard entry for the project described in this conversation. Use everything
|
|
16
|
+
this conversation shows about it: what was built, what is in progress, what was decided, what is
|
|
17
|
+
still failing, and what is left to do. The "left to do" part matters most; do not skip it.
|
|
18
|
+
|
|
19
|
+
CURRENT ENTRY:
|
|
20
|
+
<paste `workbench show --id <project-id>` output here, or write NEW: <Project Name>>
|
|
21
|
+
|
|
22
|
+
Reply with exactly one ```yaml code block and nothing else — no text before or after it.
|
|
23
|
+
|
|
24
|
+
FORMAT (keys in this order):
|
|
25
|
+
|
|
26
|
+
```yaml
|
|
27
|
+
schema_version: 1
|
|
28
|
+
id: field-robotics # keep the current id; for NEW, a slug of the name
|
|
29
|
+
name: Field Robotics # ≤80 chars
|
|
30
|
+
description: >- # ≤500 chars: what the project is and what it is for
|
|
31
|
+
Autonomous field robot for row-crop scouting: localization, navigation and mapping
|
|
32
|
+
on a ROS 2 stack, plus the tooling around it.
|
|
33
|
+
status: active # planned | active | paused | done | archived — keep current unless I said otherwise
|
|
34
|
+
uses_phases: true
|
|
35
|
+
repos: [] # copy from the current entry unchanged
|
|
36
|
+
links: [] # copy unchanged; you may add {label: ≤40 chars, url: https://...}
|
|
37
|
+
phases:
|
|
38
|
+
- id: localization
|
|
39
|
+
name: Localization
|
|
40
|
+
status: done # not_started | in_progress | done | parked
|
|
41
|
+
summary: GPS plus wheel odometry fused into a single pose estimate.
|
|
42
|
+
components:
|
|
43
|
+
- id: gps-driver
|
|
44
|
+
name: GPS driver
|
|
45
|
+
status: done
|
|
46
|
+
summary: Reads RTK fixes and publishes them in the map frame.
|
|
47
|
+
components: # optional: a component's own parts, nested to any depth
|
|
48
|
+
- id: rtk-corrections
|
|
49
|
+
name: RTK corrections
|
|
50
|
+
status: done
|
|
51
|
+
summary: Streams base-station corrections to the receiver.
|
|
52
|
+
- id: pose-fusion
|
|
53
|
+
name: Pose fusion
|
|
54
|
+
status: done
|
|
55
|
+
summary: Fuses GPS and odometry into one pose.
|
|
56
|
+
depends_on: [gps-driver]
|
|
57
|
+
- id: navigation
|
|
58
|
+
name: Navigation
|
|
59
|
+
status: in_progress
|
|
60
|
+
summary: Following crop rows and turning at headlands.
|
|
61
|
+
components:
|
|
62
|
+
- id: row-following
|
|
63
|
+
name: Row following
|
|
64
|
+
status: in_progress
|
|
65
|
+
summary: Pure-pursuit controller along detected rows.
|
|
66
|
+
notes: Overshoots at speeds above 1 m/s; gains not yet tuned in the field.
|
|
67
|
+
depends_on: [pose-fusion]
|
|
68
|
+
items:
|
|
69
|
+
- Tune lookahead distance in a field test
|
|
70
|
+
- id: headland-turns
|
|
71
|
+
name: Headland turns
|
|
72
|
+
status: not_started
|
|
73
|
+
summary: Turn-around at row ends, needed before full-field runs.
|
|
74
|
+
depends_on: [row-following]
|
|
75
|
+
topics: []
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
RULES:
|
|
79
|
+
|
|
80
|
+
1. Merge, do not regenerate. Keep every phase and component already in CURRENT ENTRY with the same
|
|
81
|
+
`id`; update its status and text, and add new ones. Never rename or drop an `id`. If the entry
|
|
82
|
+
uses `uses_phases: false` with `topics:` instead of `phases:`, keep that structure.
|
|
83
|
+
2. Status: `done` only when it is built and working; `in_progress` when partly built or not yet
|
|
84
|
+
working; `not_started` when planned; `parked` when put on hold. A phase is `done` when all its
|
|
85
|
+
components are, `in_progress` when any has started.
|
|
86
|
+
3. Left to do → `not_started` components: things I said should happen next or later, work that was
|
|
87
|
+
deferred or split off, known problems that were not fixed, and follow-ups I agreed to. Do not add
|
|
88
|
+
ideas I did not agree to.
|
|
89
|
+
4. Every phase with real work — done, in progress, or planned — has components. Only a `parked` or
|
|
90
|
+
not-yet-planned phase may have none.
|
|
91
|
+
5. Ids: lowercase letters, digits and single hyphens (`row-following`), at most 48 characters,
|
|
92
|
+
unique across the whole entry.
|
|
93
|
+
6. `depends_on` only lists ids of other components in this entry, and must not form a cycle.
|
|
94
|
+
7. `summary` ≤300 chars (what it is; for planned work, why it is needed). `notes` ≤1000 chars
|
|
95
|
+
(what is failing or blocking, and the next step). `items` is an optional checklist, each ≤300
|
|
96
|
+
chars. Leave out any optional field you have nothing for.
|
|
97
|
+
8. Do not include `updated` or `origin`; Workbench sets them.
|
|
98
|
+
9. Never include secrets, API keys, passwords, local file paths, email addresses, IP addresses,
|
|
99
|
+
pasted logs or error output, or personal information about anyone.
|
|
100
|
+
10. If something is unclear from the conversation, leave it out instead of guessing.
|
|
101
|
+
11. A component can list its own `components:` (to any depth) when it is made of smaller parts;
|
|
102
|
+
ids stay unique across the whole entry, nested ones included.
|
|
103
|
+
12. If CURRENT ENTRY has `parent:` and `under:` lines, this project is a child of another project;
|
|
104
|
+
copy both unchanged. Do not add them yourself — making a project a child of another is done
|
|
105
|
+
with `workbench new "<Name>" --parent <id> --under <item-id>` or `workbench attach`, and only
|
|
106
|
+
when I ask. A project has at most one parent. Project `status: planned` means not started yet;
|
|
107
|
+
a child project shows in the Projects tab only while `active`, otherwise only inside its parent.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workbench-review
|
|
3
|
+
description: Full review of a project's Workbench dashboard entry - reconcile everything this session built, finished, and left to do. Use when a Workbench hook reminder asks for a review (after a commit), at the end of a session, when creating a new project, or when the user runs /workbench-review. For a small change after one message, use workbench-update instead.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Workbench review: reconcile the whole entry
|
|
7
|
+
|
|
8
|
+
This is the full, milestone update (after a commit, at the end of a session, or on request). For the
|
|
9
|
+
small per-message update — one item's status, a new problem found — use the **workbench-update**
|
|
10
|
+
skill instead; it is much cheaper.
|
|
11
|
+
|
|
12
|
+
The project's dashboard entry (`project.yaml`) is its long-term memory: each session adds what it
|
|
13
|
+
learned. You are the only one who knows what this session did, so your job is to turn this
|
|
14
|
+
conversation into an accurate update — what exists now, what is half-done, and what is left to do.
|
|
15
|
+
The "left to do" part is the point of the dashboard; never skip it.
|
|
16
|
+
|
|
17
|
+
## Sources, in order of trust
|
|
18
|
+
|
|
19
|
+
1. **This conversation** (including any compaction summary): what was built, fixed, decided,
|
|
20
|
+
deferred, what is still failing, and what the user said comes next.
|
|
21
|
+
2. **The current entry** (`workbench show`): what earlier sessions recorded. Keep it unless this
|
|
22
|
+
conversation shows it is wrong or out of date.
|
|
23
|
+
3. **Repo docs and code** (README, architecture/plan/progress/TODO files): only to fill an empty or
|
|
24
|
+
newly discovered entry (`phases: []` and `topics: []`), or to check a structure you are unsure of.
|
|
25
|
+
|
|
26
|
+
## Which project?
|
|
27
|
+
|
|
28
|
+
- **Work inside one project's git repo** (the usual case, and every Stop hook reminder): run
|
|
29
|
+
`workbench show` and `workbench begin` with no arguments from that repo; they find the project
|
|
30
|
+
from the repo itself.
|
|
31
|
+
- **Work that is not in a git repo** (planning, research, hardware, chat-only sessions), **or work
|
|
32
|
+
for a project that spans several repos**, or the user names the project: pass
|
|
33
|
+
`--id <project-id>` to both `workbench show` and `workbench begin`. If unsure of the id, ask.
|
|
34
|
+
- **The project does not exist yet**: create it with `workbench new "<Project Name>"` (it prints
|
|
35
|
+
the id), then use `--id`.
|
|
36
|
+
- **The user wants this repo to belong to that project**: run `workbench link --id <project-id>`
|
|
37
|
+
from inside the repo. Only do this when the user asks.
|
|
38
|
+
|
|
39
|
+
## Steps
|
|
40
|
+
|
|
41
|
+
1. **Read the entry**: run `workbench show` (or `workbench show --id <project-id>`, see above).
|
|
42
|
+
|
|
43
|
+
2. **Take stock of this conversation** as three lists:
|
|
44
|
+
- **Built / finished** — working now (tests pass, or the user saw it work) → `done`.
|
|
45
|
+
- **In progress** — started but not complete or not yet working → `in_progress`.
|
|
46
|
+
- **Left to do** — planned work → `not_started`. This counts:
|
|
47
|
+
- what the user said should happen next or later ("next we need…", "after that…", "TODO");
|
|
48
|
+
- work deferred, descoped for now, or split off during the session;
|
|
49
|
+
- known failures that were not fixed (failing tests or checks, open bugs);
|
|
50
|
+
- follow-ups you proposed that the user agreed to;
|
|
51
|
+
- recommendations from this session that are not on the dashboard yet — **ask first**: use
|
|
52
|
+
the AskUserQuestion tool with `multiSelect: true` (one option per suggestion, short label and
|
|
53
|
+
one-line description, up to 4 options per question and 4 questions), and record only the
|
|
54
|
+
ones the user selects. Without that tool, list them numbered and ask in text.
|
|
55
|
+
|
|
56
|
+
This does **not** count: unselected or declined suggestions, or speculative features you never
|
|
57
|
+
put to the user.
|
|
58
|
+
|
|
59
|
+
3. **Decide whether to update**: if the three lists add nothing to the entry (pure refactor,
|
|
60
|
+
formatting, a small fix with no status change), run `workbench hook-check --mark-seen`, reply
|
|
61
|
+
`"Workbench: no update needed"`, and stop. A newly agreed next step or a newly known failure
|
|
62
|
+
**is** an update. (Outside a git repo there is nothing to mark seen; just reply and stop.)
|
|
63
|
+
|
|
64
|
+
4. **Edit**: run `workbench begin` (or `workbench begin --id <project-id>`) and edit the
|
|
65
|
+
`project.yaml` path it prints. Merge — do not
|
|
66
|
+
regenerate:
|
|
67
|
+
- **Keep everything already there.** Update statuses, add new items, never rename an `id`.
|
|
68
|
+
New ids are lowercase slugs (`^[a-z0-9]+(-[a-z0-9]+)*$`), unique across the whole file.
|
|
69
|
+
- **Structure** — keep an existing `uses_phases` setting. For an empty entry, choose
|
|
70
|
+
`uses_phases: true` with `phases:` if the work runs in stages, or `uses_phases: false` with
|
|
71
|
+
`topics:` if it is a set of areas.
|
|
72
|
+
- **Every phase or topic with real work — done, in progress, or planned — gets children**
|
|
73
|
+
(`components:`, or `topics:` / `subtopics:`). A phase with only a summary shows as an empty box
|
|
74
|
+
on the dashboard. Only a `parked` or not-yet-planned phase may have no children.
|
|
75
|
+
- **Status** — child: `done` only when implemented and working; `in_progress` when partly built;
|
|
76
|
+
`not_started` when planned; `parked` when the user put it on hold. A phase follows its
|
|
77
|
+
children: `done` when all are done, `in_progress` when any has started.
|
|
78
|
+
- **`depends_on`** — list component ids a component needs first (existing ids only, no cycles).
|
|
79
|
+
Link related work wherever one item really needs another.
|
|
80
|
+
- **Build the tree, don't flatten it** — put each sub-task under the item it belongs to, so the
|
|
81
|
+
entry keeps gaining depth as work is broken down; when items already exist elsewhere in the
|
|
82
|
+
entry, link to them with `depends_on` instead of duplicating them.
|
|
83
|
+
- **Nesting** — a component can hold its own `components:` list, to any depth, for a part made of
|
|
84
|
+
smaller parts. Ids stay unique across the whole project, nested ones included.
|
|
85
|
+
- **Child projects** — a piece of work too big for one entry can be its own project. The
|
|
86
|
+
*child* carries `parent: <project-id>` and `under: <phase-or-component-id>` (an item in the
|
|
87
|
+
parent, at any depth); the parent's file is not changed. Create one with
|
|
88
|
+
`workbench new "<Name>" --parent <project-id> --under <item-id>`, or place an existing project
|
|
89
|
+
with `workbench attach --id <child> --parent <project-id> --under <item-id>`
|
|
90
|
+
(`workbench detach --id <child>` undoes it). Only do this when the user agrees. A project has
|
|
91
|
+
one parent at most. Record the child's detail in the child, not in the parent.
|
|
92
|
+
- **Text fields** — `summary` (≤300 chars): what it is; for `not_started` work, what it is and
|
|
93
|
+
why it is needed. `notes` (≤1000 chars): current state that will change — what is failing or
|
|
94
|
+
blocking, counts, the next concrete step. `items` (each ≤300 chars): optional short checklist
|
|
95
|
+
of concrete sub-tasks.
|
|
96
|
+
- **Project fields** — keep `description` (≤500 chars) a one-paragraph explanation of the
|
|
97
|
+
project. Project `status`: `planned` (not started yet), `active`, `paused`, `done`, `archived`;
|
|
98
|
+
change it only if the user said so (`workbench new --status planned` for work not begun). A
|
|
99
|
+
child project shows in the Projects tab only while `active`; otherwise it shows only inside
|
|
100
|
+
its parent. Keep `parent`/`under` as they are. Do not edit `updated` or `origin`; the CLI sets
|
|
101
|
+
them.
|
|
102
|
+
- **Learning paths** may list `related_projects: [<project-id>, ...]` — a plain reference to
|
|
103
|
+
projects the learning supports; no status flows either way.
|
|
104
|
+
- **Privacy** — never include secrets, API keys, local paths (`/Users/...`, `~/...`), emails,
|
|
105
|
+
private IPs, pasted logs or error output, or personal information.
|
|
106
|
+
|
|
107
|
+
Example of recording the future:
|
|
108
|
+
```yaml
|
|
109
|
+
- id: mapping-path
|
|
110
|
+
name: Mapping path
|
|
111
|
+
status: in_progress
|
|
112
|
+
summary: Derivation sheets for the occupancy-grid mapping path.
|
|
113
|
+
notes: 13 of 253 sheets fail checks; inverse_sensor_model is the only failure on this path.
|
|
114
|
+
items:
|
|
115
|
+
- Fix inverse_sensor_model sheet citations
|
|
116
|
+
- id: second-project-nodes
|
|
117
|
+
name: Second project nodes
|
|
118
|
+
status: not_started
|
|
119
|
+
summary: Atlas nodes for a second project, to test the pipeline beyond one codebase.
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
5. **Push**: run `workbench push <worktree> -m "<one-line summary>"`. The CLI files the commit as
|
|
123
|
+
`review(<project>): <summary>`, so write only the summary.
|
|
124
|
+
- If validation or privacy checks fail, fix the file in the worktree and push again.
|
|
125
|
+
- If push reports removed ids or a large deletion, you rewrote instead of merging: restore the
|
|
126
|
+
missing items and push again. Pass `--allow-removals` only if the user explicitly asked to
|
|
127
|
+
remove something.
|
|
128
|
+
|
|
129
|
+
6. **Report**: give the one-line result from `workbench push`, then list the `not_started` items you
|
|
130
|
+
recorded so the user can correct them.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workbench-update
|
|
3
|
+
description: Quick per-message update of the Workbench dashboard - record what this message changed for the one item being worked on (a status, a note, a newly found problem). Use when a Workbench hook reminder asks for a quick update, or after a message that finished, started, or broke something. For a full reconcile of the whole entry, use workbench-review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Workbench update: record this message, scoped to one item
|
|
7
|
+
|
|
8
|
+
The dashboard should change a little after every message: something got done, something started,
|
|
9
|
+
or a new problem turned up. This skill records **only that**, for the item this message worked on.
|
|
10
|
+
Do not read or rewrite the whole entry — that is what **workbench-review** is for.
|
|
11
|
+
|
|
12
|
+
Keep it to one or two commands. Each one validates, privacy-scans, commits and pushes on its own.
|
|
13
|
+
|
|
14
|
+
## 1. Find the item
|
|
15
|
+
|
|
16
|
+
The hook reminder usually names the current **focus** (`project` or `project/item`). If it does not,
|
|
17
|
+
or this message worked on something else:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
workbench focus # current focus for this repo, if any
|
|
21
|
+
workbench show --id <project> --brief # one line per item: id, status, name
|
|
22
|
+
workbench show --id <project> --item <item-id> # just that item and its parts
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Inside a project's repo `--id` can be left out. Use the ids exactly as printed.
|
|
26
|
+
|
|
27
|
+
## 2. Record what changed
|
|
28
|
+
|
|
29
|
+
Pick the smallest command that says it:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# something moved: done, started, parked
|
|
33
|
+
workbench set <project> <item-id> --status done|in_progress|not_started|parked
|
|
34
|
+
|
|
35
|
+
# the current state changed (what is failing or blocking, the next step) — replaces the notes
|
|
36
|
+
workbench set <project> <item-id> --notes "Overshoots above 1 m/s; next: tune lookahead in a field test"
|
|
37
|
+
|
|
38
|
+
# a new problem or a newly agreed next step — a new item under an existing phase or component
|
|
39
|
+
workbench add <project> --under <item-id> --name "Fix Float timeout in rtk_sim" --status not_started \
|
|
40
|
+
--summary "rtk_sim never drops to Float, so the safety monitor's timeout cannot be tested"
|
|
41
|
+
|
|
42
|
+
# link items: this one needs others first (component ids, comma-separated; set replaces the list)
|
|
43
|
+
workbench add <project> --under <item-id> --name "Field coverage run" --depends-on headland-turns,safety-monitor
|
|
44
|
+
workbench set <project> <item-id> --depends-on headland-turns
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Build the tree, don't flatten it.** A sub-task goes `--under` the item it belongs to, so items
|
|
48
|
+
keep gaining children as work is broken down (a part of a part is fine, to any depth). Add a new
|
|
49
|
+
top-level phase only for genuinely new work.
|
|
50
|
+
|
|
51
|
+
`--name` and `--summary` can also be passed to `set`. Leave out `--under` on `add` only to create a
|
|
52
|
+
new phase (or topic). Each command remembers its project/item as the focus for this repo, so the
|
|
53
|
+
next reminder names it for you.
|
|
54
|
+
|
|
55
|
+
## 3. Let the user pick from your suggestions
|
|
56
|
+
|
|
57
|
+
If this message ended with recommendations, follow-ups, or options for the user that are not
|
|
58
|
+
already on the dashboard, do not add them silently. Ask with the **AskUserQuestion** tool,
|
|
59
|
+
`multiSelect: true`, one option per suggestion: a short label (1–5 words) and a one-line
|
|
60
|
+
description. Use up to 4 options per question and up to 4 questions; if there are more
|
|
61
|
+
suggestions, group related ones or ask about the most important.
|
|
62
|
+
|
|
63
|
+
Then add **only the selected ones**, each in the right place:
|
|
64
|
+
- `--under` the existing item it belongs to (check `workbench show --brief`), so the tree gains
|
|
65
|
+
depth instead of a flat list;
|
|
66
|
+
- `--depends-on` the items it needs first, whether they already existed or were just selected
|
|
67
|
+
(add those first so their ids exist).
|
|
68
|
+
|
|
69
|
+
Unselected suggestions were declined: do not add them. If the AskUserQuestion tool is not
|
|
70
|
+
available, list the suggestions numbered, ask which to track, and wait for the answer.
|
|
71
|
+
|
|
72
|
+
## 4. Or nothing
|
|
73
|
+
|
|
74
|
+
If this message changed nothing worth recording (a refactor, formatting, discussion that settled
|
|
75
|
+
nothing), run `workbench hook-check --mark-seen` and reply `Workbench: no update needed`.
|
|
76
|
+
|
|
77
|
+
## Rules
|
|
78
|
+
|
|
79
|
+
- **Statuses**: `done` only when built and working (tests pass or the user saw it work);
|
|
80
|
+
`in_progress` when partly built; `not_started` for planned work; `parked` when the user put it on hold.
|
|
81
|
+
- **New items**: problems actually found, next steps the user asked for or agreed to, and
|
|
82
|
+
suggestions the user selected in step 3. Your own suggestions go through step 3, never straight in.
|
|
83
|
+
- **Never** rename or remove items here; restructuring belongs in workbench-review.
|
|
84
|
+
- **Privacy**: no secrets, API keys, local paths (`/Users/...`, `~/...`), emails, private IPs,
|
|
85
|
+
pasted logs or error output, or personal information.
|
|
86
|
+
- Commits are filed as `update(<project>/<item>): ...` automatically.
|
|
87
|
+
- Then reply with the one line each command printed.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<!-- WORKBENCH:START -->
|
|
2
|
+
## Workbench Project Tracking
|
|
3
|
+
|
|
4
|
+
The project's Workbench entry (`project.yaml`) is its long-term memory on the dashboard. There are two
|
|
5
|
+
modes. The Workbench AfterAgent hook asks for a **quick update** when files changed since the last
|
|
6
|
+
update, and for a **full review** when a new commit landed; otherwise it asks for nothing.
|
|
7
|
+
|
|
8
|
+
### Quick update (after each message)
|
|
9
|
+
|
|
10
|
+
Record only what this message changed, for the one item it worked on. Do not read or rewrite the whole
|
|
11
|
+
entry. Use one or two commands; each validates, privacy-scans, commits and pushes on its own.
|
|
12
|
+
|
|
13
|
+
1. Find the item. The hook reminder usually names the current focus (`project` or `project/item`). If
|
|
14
|
+
not, or this message worked on something else:
|
|
15
|
+
```bash
|
|
16
|
+
workbench focus # current focus for this repo, if any
|
|
17
|
+
workbench show --id <project> --brief # one line per item: id, status, name
|
|
18
|
+
workbench show --id <project> --item <item-id> # just that item and its parts
|
|
19
|
+
```
|
|
20
|
+
Inside a project's repo `--id` can be left out. Use the ids exactly as printed.
|
|
21
|
+
2. Record what changed with the smallest command that says it:
|
|
22
|
+
```bash
|
|
23
|
+
workbench set <project> <item-id> --status done|in_progress|not_started|parked
|
|
24
|
+
workbench set <project> <item-id> --notes "<current state and next step>" # replaces the notes
|
|
25
|
+
workbench add <project> --under <item-id> --name "<Name>" --status not_started --summary "<why>"
|
|
26
|
+
```
|
|
27
|
+
`set` also takes `--name` and `--summary`; `add` also takes `--id` and `--notes`. Leave out
|
|
28
|
+
`--under` on `add` only to create a new phase (or topic). Each command sets the repo's focus.
|
|
29
|
+
3. Or, if this message changed nothing worth recording (refactor, formatting, discussion that settled
|
|
30
|
+
nothing), run `workbench hook-check --mark-seen` and reply "Workbench: no update needed".
|
|
31
|
+
|
|
32
|
+
Rules: `done` only when built and working (tests pass or the user saw it work); `in_progress` when
|
|
33
|
+
partly built; `not_started` for planned work; `parked` when the user put it on hold. New items only for
|
|
34
|
+
work the user agreed to, problems actually found, or suggestions the user picked: if this message ended with suggestions not yet on the dashboard, list them numbered, ask which to track, and add only the chosen ones. Put sub-tasks --under the item they belong to so the tree keeps gaining depth; link items with --depends-on <ids>. Never rename or remove items
|
|
35
|
+
here; restructuring belongs in a full review. Never include secrets, API keys, local paths, emails,
|
|
36
|
+
private IPs, pasted logs or error output, or personal information. Commits are filed as
|
|
37
|
+
`update(<project>/<item>): ...` automatically. Reply with the one line each command printed.
|
|
38
|
+
|
|
39
|
+
### Full review (after a commit, at session end, or on request)
|
|
40
|
+
|
|
41
|
+
Reconcile everything this session built, finished, and left to do. The "left to do" part is the point
|
|
42
|
+
of the dashboard; never skip it. Also use this when creating a new project.
|
|
43
|
+
|
|
44
|
+
Sources, in order of trust: (1) this conversation — what was built, fixed, decided, deferred, still
|
|
45
|
+
failing, and what the user said comes next; (2) the current entry from `workbench show` — keep it unless
|
|
46
|
+
this conversation shows it is wrong; (3) repo docs and code — only to fill an empty entry
|
|
47
|
+
(`phases: []` and `topics: []`) or check a structure.
|
|
48
|
+
|
|
49
|
+
Which project: inside one project's git repo, run `workbench show` / `workbench begin` with no
|
|
50
|
+
arguments. For work not in a git repo (planning, research, chat-only), for a project spanning several
|
|
51
|
+
repos, or when the user names the project, pass `--id <project-id>` to both (ask if unsure of the id).
|
|
52
|
+
If the project does not exist yet, create it with `workbench new "<Project Name>"`. If the user wants
|
|
53
|
+
the current repo to belong to that project, run `workbench link --id <project-id>` inside the repo.
|
|
54
|
+
|
|
55
|
+
1. Run `workbench show` (or `workbench show --id <project-id>`).
|
|
56
|
+
2. Take stock of this conversation as three lists:
|
|
57
|
+
- Built / finished (working now) → `done`.
|
|
58
|
+
- In progress (started, not complete or not working yet) → `in_progress`.
|
|
59
|
+
- Left to do → `not_started`: what the user said comes next or later, work deferred or split off,
|
|
60
|
+
known unfixed failures (failing tests or checks, open bugs), and follow-ups you proposed that the
|
|
61
|
+
user agreed to, and suggestions from this session the user picked when asked (list them numbered and ask which to track). Not unpicked suggestions or speculative features you never raised.
|
|
62
|
+
3. If the lists add nothing to the entry (pure refactor, formatting, a small fix with no status change),
|
|
63
|
+
run `workbench hook-check --mark-seen`, reply "Workbench: no update needed", and stop. A newly agreed
|
|
64
|
+
next step or newly known failure is an update. (Outside a git repo, just reply and stop.)
|
|
65
|
+
4. Run `workbench begin` (or `workbench begin --id <project-id>`) and edit the printed `project.yaml`.
|
|
66
|
+
Merge — do not regenerate:
|
|
67
|
+
- Keep everything already there; update statuses, add items, never rename an `id`. New ids are
|
|
68
|
+
unique lowercase slugs.
|
|
69
|
+
- Keep an existing `uses_phases` setting. For an empty entry use `uses_phases: true` with `phases:` if
|
|
70
|
+
the work runs in stages, or `uses_phases: false` with `topics:` if it is a set of areas.
|
|
71
|
+
- Every phase or topic with real work — done, in progress, or planned — gets children (`components:`,
|
|
72
|
+
or `topics:` / `subtopics:`). Only a `parked` or not-yet-planned phase may have none.
|
|
73
|
+
- Child status: `done` only when implemented and working; `in_progress` when partly built;
|
|
74
|
+
`not_started` when planned; `parked` when on hold. A phase follows its children.
|
|
75
|
+
- `depends_on` lists component ids needed first (existing ids, no cycles); link related work instead of duplicating it.
|
|
76
|
+
- Build the tree: put each sub-task under the item it belongs to, to any depth, rather than flat at the top.
|
|
77
|
+
- A component may hold its own `components:` list (any depth); ids stay unique across the project.
|
|
78
|
+
- A big piece of work can be its own child project: the child carries `parent: <project-id>` and
|
|
79
|
+
`under: <phase-or-component-id>` (an item in the parent, any depth). Only if the user agrees,
|
|
80
|
+
create it with `workbench new "<Name>" --parent <id> --under <item-id>` or place an existing one
|
|
81
|
+
with `workbench attach --id <child> --parent <id> --under <item-id>` (`workbench detach --id
|
|
82
|
+
<child>` undoes it). One parent per project; record the child's detail in the child.
|
|
83
|
+
- `summary` (≤300 chars): what it is, and for planned work why it is needed. `notes` (≤1000 chars):
|
|
84
|
+
what is failing or blocking and the next concrete step. `items`: optional short sub-task checklist.
|
|
85
|
+
- Project `status`: `planned` (not started), `active`, `paused`, `done`, `archived`; change it only
|
|
86
|
+
if the user said so. A child project shows in the Projects tab only while `active`, otherwise
|
|
87
|
+
only inside its parent. Keep `parent`/`under`. Do not edit `updated` or `origin`.
|
|
88
|
+
- Learning paths may list `related_projects: [<project-id>]` (a reference only; no status flows).
|
|
89
|
+
- Never include secrets, local paths, emails, private IPs, pasted logs, or personal information.
|
|
90
|
+
5. Run `workbench push <worktree> -m "<one-line summary>"`; the CLI files the commit as
|
|
91
|
+
`review(<project>): <summary>`, so write only the summary. If validation fails, fix the file and push
|
|
92
|
+
again. If it reports removed ids or a large deletion, restore the missing items. Pass
|
|
93
|
+
`--allow-removals` only if the user explicitly asked to remove something.
|
|
94
|
+
6. Report the one-line result, then list the `not_started` items you recorded so the user can correct
|
|
95
|
+
them.
|
|
96
|
+
<!-- WORKBENCH:END -->
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
description = "Full Workbench review of this project's entry"
|
|
2
|
+
|
|
3
|
+
prompt = """
|
|
4
|
+
Reconcile the current project's Workbench entry with this conversation by following the
|
|
5
|
+
"Full review (after a commit, at session end, or on request)" section of the Workbench Project
|
|
6
|
+
Tracking instructions in your GEMINI.md context: record what this session built, what is in
|
|
7
|
+
progress, and what is left to do, then push with `workbench push`.
|
|
8
|
+
"""
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
description = "Quick Workbench update for what this message changed"
|
|
2
|
+
|
|
3
|
+
prompt = """
|
|
4
|
+
Record what this message changed in the current project's Workbench entry, scoped to the one item it
|
|
5
|
+
worked on, by following the "Quick update (after each message)" section of the Workbench Project
|
|
6
|
+
Tracking instructions in your GEMINI.md context: find the item with `workbench focus` or
|
|
7
|
+
`workbench show --brief`, then run the smallest `workbench set` or `workbench add` command, or
|
|
8
|
+
`workbench hook-check --mark-seen` if nothing changed.
|
|
9
|
+
"""
|