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.
Files changed (83) hide show
  1. workbench/__init__.py +3 -0
  2. workbench/__main__.py +3 -0
  3. workbench/agents/__init__.py +1 -0
  4. workbench/agents/assets/chat/LEARNING_PROMPT.md +67 -0
  5. workbench/agents/assets/chat/PROMPT.md +107 -0
  6. workbench/agents/assets/claude/workbench-review/SKILL.md +130 -0
  7. workbench/agents/assets/claude/workbench-update/SKILL.md +87 -0
  8. workbench/agents/assets/gemini/GEMINI.md +96 -0
  9. workbench/agents/assets/gemini/commands/workbench-review.toml +8 -0
  10. workbench/agents/assets/gemini/commands/workbench-update.toml +9 -0
  11. workbench/agents/hooks.py +388 -0
  12. workbench/agents/install.py +242 -0
  13. workbench/agents/updater.py +499 -0
  14. workbench/cli/__init__.py +48 -0
  15. workbench/cli/__main__.py +3 -0
  16. workbench/cli/_common.py +421 -0
  17. workbench/cli/agents.py +236 -0
  18. workbench/cli/demo.py +22 -0
  19. workbench/cli/discover.py +30 -0
  20. workbench/cli/hierarchy.py +275 -0
  21. workbench/cli/history.py +124 -0
  22. workbench/cli/items.py +170 -0
  23. workbench/cli/learning.py +113 -0
  24. workbench/cli/projects.py +522 -0
  25. workbench/cli/server.py +72 -0
  26. workbench/cli/setup.py +114 -0
  27. workbench/commitmsg.py +104 -0
  28. workbench/config.py +109 -0
  29. workbench/demo/__init__.py +13 -0
  30. workbench/demo/data/github_fixtures.yaml +58 -0
  31. workbench/demo/data/repos.yaml +67 -0
  32. workbench/demo/data/seed/learning/demo-control-theory/path.yaml +40 -0
  33. workbench/demo/data/seed/learning/demo-linear-algebra/path.yaml +51 -0
  34. workbench/demo/data/seed/learning/demo-robotics-kinematics/path.yaml +51 -0
  35. workbench/demo/data/seed/learning/demo-robotics-kinematics/topics/rigid-motions.md +6 -0
  36. workbench/demo/data/seed/learning/demo-signal-processing/path.yaml +77 -0
  37. workbench/demo/data/seed/learning/demo-signal-processing/topics/aliasing.md +6 -0
  38. workbench/demo/data/seed/learning/demo-signal-processing/topics/filters.md +6 -0
  39. workbench/demo/data/seed/learning/demo-signal-processing/topics/sampling.md +9 -0
  40. workbench/demo/data/seed/projects/demo-budget-cli/project.yaml +67 -0
  41. workbench/demo/data/seed/projects/demo-esp32-audio-dsp/project.yaml +71 -0
  42. workbench/demo/data/seed/projects/demo-fpga-logic-analyzer/project.yaml +62 -0
  43. workbench/demo/data/seed/projects/demo-home-lab-cluster/project.yaml +115 -0
  44. workbench/demo/data/seed/projects/demo-notes-sync/project.yaml +15 -0
  45. workbench/demo/data/seed/projects/demo-old-game/project.yaml +28 -0
  46. workbench/demo/data/seed/projects/demo-portfolio-site/project.yaml +55 -0
  47. workbench/demo/data/seed/projects/demo-robot-arm/project.yaml +200 -0
  48. workbench/demo/data/seed/projects/demo-weather-station/project.yaml +145 -0
  49. workbench/demo/data/seed/workbench.yaml +1 -0
  50. workbench/demo/environment.py +201 -0
  51. workbench/demo/fake_github.py +62 -0
  52. workbench/discovery/__init__.py +1 -0
  53. workbench/discovery/github.py +201 -0
  54. workbench/discovery/local.py +143 -0
  55. workbench/discovery/register.py +195 -0
  56. workbench/edits.py +498 -0
  57. workbench/gitops.py +276 -0
  58. workbench/identity.py +95 -0
  59. workbench/learning_md.py +171 -0
  60. workbench/models.py +292 -0
  61. workbench/privacy.py +310 -0
  62. workbench/semantic.py +193 -0
  63. workbench/server/__init__.py +1 -0
  64. workbench/server/app.py +351 -0
  65. workbench/server/sync.py +267 -0
  66. workbench/server/writes/__init__.py +52 -0
  67. workbench/server/writes/_transaction.py +196 -0
  68. workbench/server/writes/fields.py +198 -0
  69. workbench/server/writes/structure.py +299 -0
  70. workbench/server/writes/suggestions.py +59 -0
  71. workbench/validate.py +375 -0
  72. workbench/web_dist/apple-touch-icon.png +0 -0
  73. workbench/web_dist/assets/index-B-uZPmYA.js +78 -0
  74. workbench/web_dist/assets/index-C0Ywyco5.css +1 -0
  75. workbench/web_dist/favicon-32.png +0 -0
  76. workbench/web_dist/favicon.svg +9 -0
  77. workbench/web_dist/index.html +16 -0
  78. workbench/yamlio.py +63 -0
  79. workbench_dashboard-0.1.3.dist-info/METADATA +322 -0
  80. workbench_dashboard-0.1.3.dist-info/RECORD +83 -0
  81. workbench_dashboard-0.1.3.dist-info/WHEEL +4 -0
  82. workbench_dashboard-0.1.3.dist-info/entry_points.txt +2 -0
  83. workbench_dashboard-0.1.3.dist-info/licenses/LICENSE +21 -0
workbench/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ """Workbench: personal dashboard for software projects and learning paths."""
2
+
3
+ __version__ = "0.1.3"
workbench/__main__.py ADDED
@@ -0,0 +1,3 @@
1
+ from workbench.cli import app
2
+
3
+ app()
@@ -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
+ """