@zalom/plastic 1.0.0-beta.32 → 1.0.0-beta.33
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/PLASTIC.md
CHANGED
|
@@ -329,10 +329,12 @@ is a named, ordered, delivery-side collection of intents: the delivery-side coun
|
|
|
329
329
|
release (completion-side, tracked in `CHANGELOG.md`). Use `plastic-roadmap` to create, order,
|
|
330
330
|
close, and consume one.
|
|
331
331
|
|
|
332
|
-
File location: `roadmaps/{slug}.md`, a
|
|
333
|
-
store (
|
|
334
|
-
|
|
335
|
-
|
|
332
|
+
File location: `roadmaps/{slug}.md`, a sibling of `INDEX.md`, wherever `INDEX.md` lives, never
|
|
333
|
+
inside `store/` (store holds intent directories, not project artifacts). For a project that is its
|
|
334
|
+
root, `~/.plastic/projects/{slug}/roadmaps/`, beside `project.yml`; for the global tier it is
|
|
335
|
+
`~/.plastic/roadmaps/`, beside `~/.plastic/INDEX.md`. `roadmaps/` lists only live (open or
|
|
336
|
+
in-flight) roadmaps: once a roadmap's goal is reached, it moves to `roadmaps/archived/{slug}.md`,
|
|
337
|
+
a sibling subdirectory scaffolded once with a `.gitkeep`.
|
|
336
338
|
|
|
337
339
|
A roadmap file has four sections, in order: a title/meta header, `## Goal`, `## Waves`, and an
|
|
338
340
|
append-only dated `## Log`. `## Goal` is a checkable prose condition read by a human or agent, not
|
|
@@ -345,8 +347,9 @@ on any conflict INDEX wins and the roadmap entry is corrected to match.
|
|
|
345
347
|
|
|
346
348
|
**Human-comprehension surface.** A roadmap is also written to be read cold. Wave entries render as
|
|
347
349
|
checkboxes (checked once delivered, unchecked otherwise) next to the status token, and each `## Log`
|
|
348
|
-
line is one plain-language sentence,
|
|
349
|
-
non-expert executive: what shipped and why it matters, no jargon
|
|
350
|
+
line is one plain-language sentence, starting `YYYY-MM-DD HH:MM UTC`, written the way an
|
|
351
|
+
engineering manager would brief a non-expert executive: what shipped and why it matters, no jargon
|
|
352
|
+
or codenames, ending with a link
|
|
350
353
|
to that intent's `outcome.md`. The log points at the detail instead of repeating it, so a person
|
|
351
354
|
opening the file with no other context can tell what shipped, what is running now, and what is
|
|
352
355
|
next in under a minute.
|
package/package.json
CHANGED
package/scripts/update.rb
CHANGED
|
@@ -53,18 +53,22 @@ class Update < InstallerCore
|
|
|
53
53
|
end
|
|
54
54
|
puts "\u{2b06}\u{fe0f} Updating Plastic #{iv} \u{2192} #{res[:target]}"
|
|
55
55
|
exit_code = perform_switch(res[:target], agent_args(argv))
|
|
56
|
-
run_post_update_doctor if exit_code == 0
|
|
56
|
+
run_post_update_doctor(full: argv.include?("--full-doctor")) if exit_code == 0
|
|
57
57
|
exit_code
|
|
58
58
|
end
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
-
# Run
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
|
|
61
|
+
# Run doctor after a successful update and print a human-readable summary.
|
|
62
|
+
# Defaults to the fast core tier (agent registration + core files + manifest
|
|
63
|
+
# sync, binary pass|fail, no store walk) so a newcomer's first post-update
|
|
64
|
+
# run is not buried in convention warns they cannot act on. `full: true`
|
|
65
|
+
# (via `--full-doctor`) runs the complete store walk instead. Informational
|
|
66
|
+
# only: does not raise and does not affect the update's exit code. Accepts
|
|
67
|
+
# injected `doctor` and `out` for hermetic unit tests.
|
|
68
|
+
def run_post_update_doctor(doctor: nil, out: $stdout, full: false)
|
|
65
69
|
doctor ||= Doctor.new
|
|
66
|
-
out.puts "\nRunning full doctor after update..."
|
|
67
|
-
result = doctor.run_checks("claude")
|
|
70
|
+
out.puts full ? "\nRunning full doctor after update..." : "\nRunning core doctor after update..."
|
|
71
|
+
result = full ? doctor.run_checks("claude") : doctor.run_core_checks("claude")
|
|
68
72
|
s = result[:summary]
|
|
69
73
|
out.puts " Doctor status: #{result[:status]} " \
|
|
70
74
|
"(pass: #{s[:pass]}, warn: #{s[:warn]}, fail: #{s[:fail]}, total: #{s[:total]})"
|
|
@@ -152,6 +156,11 @@ class Update < InstallerCore
|
|
|
152
156
|
Agent options (default: --claude):
|
|
153
157
|
--claude --codex --hermes --all
|
|
154
158
|
|
|
159
|
+
Post-update doctor:
|
|
160
|
+
By default, a successful update runs the fast core doctor sync (agent
|
|
161
|
+
registration, core files, manifest — binary pass|fail, no store walk).
|
|
162
|
+
--full-doctor Run the full doctor (complete store walk) after updating.
|
|
163
|
+
|
|
155
164
|
Behaviour:
|
|
156
165
|
No flag advances to the next version on your current channel. Switching toward a
|
|
157
166
|
more stable channel is frictionless; switching toward bleeding edge is confirmed.
|
package/skills/roadmap/SKILL.md
CHANGED
|
@@ -6,9 +6,11 @@ description: Use when the user wants to plan a delivery batch, order waves of in
|
|
|
6
6
|
# Roadmap
|
|
7
7
|
|
|
8
8
|
A roadmap is a named, ordered, delivery-side collection of intents: the delivery-side counterpart
|
|
9
|
-
to a release (completion-side, `CHANGELOG.md`). It lives at `roadmaps/{slug}.md`, a
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
to a release (completion-side, `CHANGELOG.md`). It lives at `roadmaps/{slug}.md`, a sibling of
|
|
10
|
+
`INDEX.md` wherever `INDEX.md` lives: the global tier's `~/.plastic/roadmaps/` (beside
|
|
11
|
+
`~/.plastic/INDEX.md`), or a project's root, `~/.plastic/projects/{slug}/roadmaps/` (beside that
|
|
12
|
+
project's `INDEX.md` and `project.yml`). It never sits inside `store/`, which holds intent
|
|
13
|
+
directories, not project artifacts.
|
|
12
14
|
|
|
13
15
|
A roadmap file has four parts: a title/meta header, `## Goal` (prose), `## Waves` (ordered; entries
|
|
14
16
|
inside a wave are parallel-safe, waves run sequentially), and an append-only dated `## Log`. Each
|
|
@@ -37,8 +39,9 @@ verb above.
|
|
|
37
39
|
|
|
38
40
|
## Notes
|
|
39
41
|
|
|
40
|
-
- File location and the four-section shape are identical across
|
|
41
|
-
layout per project.
|
|
42
|
+
- File location and the four-section shape are identical across tiers; do not invent a different
|
|
43
|
+
layout per project. The general rule: `roadmaps/` is a sibling of `INDEX.md`, wherever `INDEX.md`
|
|
44
|
+
lives.
|
|
42
45
|
- `## Goal` is a checkable prose condition read by a human or agent, not an executable checker.
|
|
43
46
|
- Wave entries render as checkboxes (`- [x] ... — delivered` / `- [ ] ... — <status>`); a human
|
|
44
47
|
reading cold should see shipped/running/next within a minute. `## Log` lines are one-sentence,
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## Location
|
|
4
4
|
|
|
5
|
-
`roadmaps/{slug}.md`, a
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
`roadmaps/{slug}.md`, a sibling of `INDEX.md`, wherever `INDEX.md` lives. For the global tier
|
|
6
|
+
that is `~/.plastic/roadmaps/{slug}.md` (beside `~/.plastic/INDEX.md`); for any project it is
|
|
7
|
+
that project's root, `~/.plastic/projects/{slug}/roadmaps/{slug}.md` (beside that project's
|
|
8
|
+
`INDEX.md` and `project.yml`). `roadmaps/` never sits inside `store/`: `store/` holds intent
|
|
9
|
+
directories, not project artifacts. Create the `roadmaps/` directory the first time a tier gets a
|
|
10
|
+
roadmap.
|
|
9
11
|
|
|
10
12
|
`roadmaps/` lists only live (open or in-flight) roadmaps. Once a roadmap's `## Goal` is reached,
|
|
11
13
|
its file moves to `roadmaps/archived/{slug}.md` (see Close/archive in `operations.md`); the
|
|
@@ -14,7 +16,7 @@ its file moves to `roadmaps/archived/{slug}.md` (see Close/archive in `operation
|
|
|
14
16
|
## The four sections (in order)
|
|
15
17
|
|
|
16
18
|
1. **Title/meta header** — `# Roadmap: <name>` plus a one-line meta sentence naming what the
|
|
17
|
-
roadmap delivers and which
|
|
19
|
+
roadmap delivers and which tier (project or global) it lives in.
|
|
18
20
|
2. **`## Goal`** — a checkable prose condition: one or a few sentences a human or coordinator reads
|
|
19
21
|
to decide the roadmap is done. Not an executable checker, not a list of tasks.
|
|
20
22
|
3. **`## Waves`** — ordered waves (`### Wave 1`, `### Wave 2`, ...). Entries inside a wave are
|
|
@@ -49,12 +51,13 @@ it. The roadmap never sets a status that INDEX does not already reflect.
|
|
|
49
51
|
|
|
50
52
|
## Log line shape
|
|
51
53
|
|
|
52
|
-
One line per event,
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
One line per event, starting `YYYY-MM-DD HH:MM UTC` (human-readable, sortable, zone-explicit so
|
|
55
|
+
same-day parallel deliveries can still be ordered), in plain-language EM-to-CTO voice: what shipped
|
|
56
|
+
and why it matters to a non-expert reader, no jargon or internal codenames, ending with a link to
|
|
57
|
+
that entry-intent's `outcome.md`:
|
|
55
58
|
|
|
56
59
|
```
|
|
57
|
-
- <YYYY-MM-DD> <one plain-language sentence: what shipped, its impact> — see store/<id>--<slug>/outcome.md
|
|
60
|
+
- <YYYY-MM-DD HH:MM UTC> <one plain-language sentence: what shipped, its impact> — see store/<id>--<slug>/outcome.md
|
|
58
61
|
```
|
|
59
62
|
|
|
60
63
|
The log line never restates `outcome.md` detail; it points at it (lossless-by-reference). This
|
|
@@ -83,6 +86,6 @@ abandoned | blocked); INDEX wins on any conflict.
|
|
|
83
86
|
- [x] 124 Roadmap feature — delivered
|
|
84
87
|
|
|
85
88
|
## Log
|
|
86
|
-
- 2026-07-06 Shipped the bash-gate redirect fix so quoted arrows and heredoc trailers
|
|
87
|
-
blocking legitimate commits — see store/121--fix-bash-gate-redirect-parsing/outcome.md.
|
|
89
|
+
- 2026-07-06 14:32 UTC Shipped the bash-gate redirect fix so quoted arrows and heredoc trailers
|
|
90
|
+
stop blocking legitimate commits — see store/121--fix-bash-gate-redirect-parsing/outcome.md.
|
|
88
91
|
```
|
|
@@ -10,14 +10,16 @@ next" in under a minute, just from this one file.
|
|
|
10
10
|
## Create
|
|
11
11
|
|
|
12
12
|
1. Pick a `slug` (kebab-case, descriptive) and a `title`.
|
|
13
|
-
2. Resolve the
|
|
14
|
-
`~/.plastic
|
|
13
|
+
2. Resolve the tier root: the directory that holds `INDEX.md` (a project's root, beside
|
|
14
|
+
`project.yml`, or `~/.plastic/` for the global tier). `roadmaps/` is always a sibling of
|
|
15
|
+
`INDEX.md`, never inside `store/`. Create `roadmaps/` there if it does not exist yet.
|
|
15
16
|
3. Copy `templates/roadmap.md` to `roadmaps/{slug}.md`.
|
|
16
17
|
4. Fill the header (`# Roadmap: <title>` + the one-line meta) and write a real `## Goal` prose
|
|
17
18
|
condition.
|
|
18
19
|
5. Add at least one `## Waves` wave with real entries (see Add / reorder below), each entry's
|
|
19
20
|
status mirroring that intent's current `INDEX.md` status.
|
|
20
|
-
6. Append the first `## Log` line, a short
|
|
21
|
+
6. Append the first `## Log` line, a short `YYYY-MM-DD HH:MM UTC`-prefixed plain-language note
|
|
22
|
+
that the roadmap was created.
|
|
21
23
|
|
|
22
24
|
## Add / reorder entries
|
|
23
25
|
|
|
@@ -29,7 +31,7 @@ next" in under a minute, just from this one file.
|
|
|
29
31
|
entries) earlier or later. Reordering never changes an entry's status; it only changes when the
|
|
30
32
|
entry is eligible to run.
|
|
31
33
|
- After any add/reorder, append a `## Log` line describing the change (e.g.
|
|
32
|
-
`- <YYYY-MM-DD> added 132 to wave 2`).
|
|
34
|
+
`- <YYYY-MM-DD HH:MM UTC> added 132 to wave 2`).
|
|
33
35
|
|
|
34
36
|
## Sync status mirror
|
|
35
37
|
|
|
@@ -46,8 +48,8 @@ next" in under a minute, just from this one file.
|
|
|
46
48
|
|
|
47
49
|
## Append a log line
|
|
48
50
|
|
|
49
|
-
- One line per event,
|
|
50
|
-
an existing line (append-only).
|
|
51
|
+
- One line per event, starting `YYYY-MM-DD HH:MM UTC`, appended at the bottom of `## Log`. Never
|
|
52
|
+
edit or delete an existing line (append-only).
|
|
51
53
|
- Every line is plain language a non-expert can read, never a codename or a raw `field -> value`.
|
|
52
54
|
A delivery event follows the EM-to-CTO one-line shape with an `outcome.md` link (see
|
|
53
55
|
`file-format.md`); bookkeeping events (created, an intent added to a wave, a wave completed, a
|
|
@@ -68,7 +70,9 @@ next" in under a minute, just from this one file.
|
|
|
68
70
|
|
|
69
71
|
1. Confirm the roadmap's `## Goal` prose condition is met (every entry `delivered` or explicitly
|
|
70
72
|
`abandoned` with a recorded reason, plus whatever else the goal states).
|
|
71
|
-
2. Create `roadmaps/archived/`
|
|
73
|
+
2. Create `roadmaps/archived/` beside `roadmaps/` (both siblings of `INDEX.md`) if it does not
|
|
74
|
+
exist yet.
|
|
72
75
|
3. Move the file: `roadmaps/{slug}.md` -> `roadmaps/archived/{slug}.md`. `roadmaps/` itself then
|
|
73
76
|
lists only live (open or in-flight) roadmaps.
|
|
74
|
-
4. Append the final `## Log` line before or as part of the move:
|
|
77
|
+
4. Append the final `## Log` line before or as part of the move:
|
|
78
|
+
`- <YYYY-MM-DD HH:MM UTC> roadmap closed`.
|
package/templates/roadmap.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Roadmap: <name>
|
|
2
2
|
|
|
3
|
-
(one-line meta: what this roadmap delivers, and which
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
(one-line meta: what this roadmap delivers, and which tier it lives in. `roadmaps/` is a sibling
|
|
4
|
+
of `INDEX.md` — a project's root or the global `~/.plastic/`, never inside `store/`. When this
|
|
5
|
+
roadmap's goal is reached, move this file from `roadmaps/{slug}.md` to
|
|
6
|
+
`roadmaps/archived/{slug}.md`; `roadmaps/` itself lists only live roadmaps.)
|
|
6
7
|
|
|
7
8
|
## Goal
|
|
8
9
|
(a checkable prose condition — one or a few sentences a human or coordinator reads to decide the
|
|
@@ -26,4 +27,4 @@ any conflict between the checkbox/token here and INDEX's real status.
|
|
|
26
27
|
what shipped and its impact for a non-expert reader, no jargon or internal codenames, ending with a
|
|
27
28
|
link to that entry-intent's `outcome.md`. Never restate outcome detail here; link to it instead.
|
|
28
29
|
Newest at the bottom.)
|
|
29
|
-
- 2026-01-01 Shipped the first wave of this roadmap; see store/<intent-id>--<slug>/outcome.md.
|
|
30
|
+
- 2026-01-01 00:00 UTC Shipped the first wave of this roadmap; see store/<intent-id>--<slug>/outcome.md.
|