@zalom/plastic 1.0.0-beta.37 → 1.0.0-beta.39
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/README.md +114 -107
- package/package.json +1 -1
- package/scripts/dashboard.rb +12 -2
package/README.md
CHANGED
|
@@ -1,72 +1,29 @@
|
|
|
1
1
|
# Plastic
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
ends and the next one starts from nothing. Plastic keeps a durable, growing
|
|
8
|
-
record of your work as you do it, so that thread never breaks.
|
|
9
|
-
|
|
10
|
-
## Why Plastic
|
|
11
|
-
|
|
12
|
-
You do not write documentation about your work after the fact. You do the
|
|
13
|
-
work as an intent (a short file that states what you want, why, how you plan
|
|
14
|
-
to get there, and what happened). Because intents stay after you finish them,
|
|
15
|
-
and because they link to the intents that shaped them and the ones they led
|
|
16
|
-
to, they build into a queryable trace of your project over time. You can ask
|
|
17
|
-
what happened, why a choice was made, or where an idea came from, and get an
|
|
18
|
-
answer grounded in your own history. Memory is the result of working this
|
|
19
|
-
way, not a feature bolted onto an agent afterward.
|
|
20
|
-
|
|
21
|
-
## Two founding systems
|
|
3
|
+
[](https://www.npmjs.com/package/@zalom/plastic)
|
|
4
|
+
[](https://www.npmjs.com/package/@zalom/plastic)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://github.com/zalom/plastic/actions/workflows/test.yml)
|
|
22
7
|
|
|
23
|
-
**
|
|
24
|
-
linked notes that add up to more than their sum. The name borrows from
|
|
25
|
-
neuroplasticity, the brain's own way of adapting and rewiring itself. An
|
|
26
|
-
intent is one such note. Its `sources` and `chain` links connect it to the
|
|
27
|
-
intents that shaped it and the ones it led to, so the store grows into a
|
|
28
|
-
graph you can actually navigate, not a pile of files.
|
|
29
|
-
|
|
30
|
-
**System for the Work.** Plastic separates the deterministic part of work
|
|
31
|
-
from the creative part. The blueprint (conventions, templates, directory
|
|
32
|
-
layout, and the lifecycle stages) is fixed: it comes out the same shape no
|
|
33
|
-
matter who or what is doing the work. The thinking (the actual reasoning
|
|
34
|
-
about what to build and how) stays free: a human or an agent does it, and
|
|
35
|
-
Plastic never replaces that judgment, only steers and checks it. This is
|
|
36
|
-
convention over configuration: one readable shape for every intent, so any
|
|
37
|
-
person or agent can pick up where another left off.
|
|
38
|
-
|
|
39
|
-
## The Two Cycles
|
|
40
|
-
|
|
41
|
-
**Coordinator loop (B→O→R):** Build → Observe → Repeat. The agent advances
|
|
42
|
-
the active intent, observes what the work surfaced, and repeats with the
|
|
43
|
-
next one. This loop runs continuously, across sessions.
|
|
8
|
+
**Where you were, where you are, where you are heading.**
|
|
44
9
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
10
|
+
The everyday problem is losing the thread of your own work. You step away
|
|
11
|
+
for a day, come back, and the reasoning behind a decision is gone. Plastic
|
|
12
|
+
keeps a durable record of your work as you make it, so the thread never
|
|
13
|
+
breaks. Read [why I built it](MANIFESTO.md).
|
|
48
14
|
|
|
49
|
-
|
|
15
|
+
Paste this to your coding agent to start:
|
|
50
16
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
software delivery.
|
|
58
|
-
|
|
59
|
-
Projects like beads add persistent memory on top of an existing agent
|
|
60
|
-
workflow. Plastic shares that goal, an agent should remember what it did and
|
|
61
|
-
why, but gets there by making the intent itself, with its spec, plan, and
|
|
62
|
-
delivered outcome, the actual unit of work. Plastic runs today with Claude
|
|
63
|
-
Code, and works with Cursor and Cline through the same file-based
|
|
64
|
-
conventions.
|
|
17
|
+
```
|
|
18
|
+
Install Plastic: run `npx @zalom/plastic@beta --claude`.
|
|
19
|
+
Then run `/clear` and say "new intent" to begin.
|
|
20
|
+
Drive the work through What, Why, How, and Exec, and let Plastic
|
|
21
|
+
keep the record as we go.
|
|
22
|
+
```
|
|
65
23
|
|
|
66
24
|
## Install
|
|
67
25
|
|
|
68
|
-
Plastic
|
|
69
|
-
later.
|
|
26
|
+
Plastic needs Ruby (already on macOS and Linux) and Node.js 18 or later.
|
|
70
27
|
|
|
71
28
|
Plastic is in beta. Install with:
|
|
72
29
|
|
|
@@ -74,85 +31,135 @@ Plastic is in beta. Install with:
|
|
|
74
31
|
npx @zalom/plastic@beta --claude
|
|
75
32
|
```
|
|
76
33
|
|
|
77
|
-
|
|
78
|
-
|
|
34
|
+
Swap `--claude` for `--codex`, `--hermes`, or `--all` to match your agent.
|
|
35
|
+
Bun users can run `bunx` in place of `npx`; Bun is never required. To update
|
|
36
|
+
later, say "update plastic" or run the same `@beta` command again.
|
|
79
37
|
|
|
80
|
-
A stable channel will follow
|
|
38
|
+
A stable channel will follow. The bare command below is not a working
|
|
39
|
+
install yet. It resolves to an early stub release, so keep `@beta` for now.
|
|
81
40
|
|
|
82
41
|
```bash
|
|
83
|
-
# Stable (when available, general use)
|
|
84
42
|
npx @zalom/plastic --claude
|
|
85
43
|
```
|
|
86
44
|
|
|
87
|
-
The bare command above is not a working install yet. It currently resolves
|
|
88
|
-
to an early stub release, so use `@beta` for now.
|
|
89
|
-
|
|
90
|
-
Bun users can substitute `bunx` for `npx` (for example, `bunx
|
|
91
|
-
@zalom/plastic@beta --claude`). Bun is never required.
|
|
92
|
-
|
|
93
45
|
Skills install as flat, hyphen-namespaced personal skills (`plastic-doctor`,
|
|
94
|
-
`plastic-auto`, and so on). Invoke them with a hyphen. Plastic is
|
|
95
|
-
Claude Code plugin; re-running the installer
|
|
96
|
-
|
|
46
|
+
`plastic-auto`, and so on). Invoke them with a hyphen. Plastic is not a
|
|
47
|
+
Claude Code plugin; re-running the installer removes any legacy plugin
|
|
48
|
+
registration.
|
|
97
49
|
|
|
98
|
-
|
|
50
|
+
## The lost thread
|
|
99
51
|
|
|
100
|
-
|
|
52
|
+
You do the work as an intent: a short file that states what you want, why,
|
|
53
|
+
how you plan to get there, and what happened. Intents stay after you finish,
|
|
54
|
+
and link to the ones that shaped them and the ones they led to, so your
|
|
55
|
+
project builds into a record you can ask questions against.
|
|
101
56
|
|
|
102
|
-
|
|
103
|
-
|
|
57
|
+
Come back after a day and ask where you were:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
You: Where was I?
|
|
61
|
+
Agent: Last intent: 140, "README round two". The plan is written and
|
|
62
|
+
approved. Next step is the ships-itself proof block. Want me to
|
|
63
|
+
pick it up in auto?
|
|
104
64
|
```
|
|
105
65
|
|
|
106
|
-
|
|
107
|
-
|
|
66
|
+
Memory is the result of working this way, not a feature bolted onto an agent
|
|
67
|
+
afterward.
|
|
108
68
|
|
|
109
69
|
## Quick Start
|
|
110
70
|
|
|
111
71
|
After installation, run `/clear` to load Plastic conventions, then:
|
|
112
72
|
|
|
113
|
-
1. Say "new intent"
|
|
114
|
-
2. Describe what you want
|
|
115
|
-
3.
|
|
116
|
-
|
|
117
|
-
|
|
73
|
+
1. Say "new intent" to create your first piece of work
|
|
74
|
+
2. Describe what you want, in plain words
|
|
75
|
+
3. Explore the design, write a plan, then deliver it, one stage at a time
|
|
76
|
+
|
|
77
|
+
Guided delivery (a human at every gate) is the default. Say "auto" to let
|
|
78
|
+
the agent run the full lifecycle on its own. Run `/plastic-dashboard` any
|
|
79
|
+
time for a Value x Effort view of every intent and what to do next.
|
|
118
80
|
|
|
119
|
-
|
|
120
|
-
|
|
81
|
+
<details>
|
|
82
|
+
<summary>See the full 10-minute walkthrough</summary>
|
|
121
83
|
|
|
122
|
-
|
|
123
|
-
|
|
84
|
+
1. Install once: `npx @zalom/plastic@beta --claude`.
|
|
85
|
+
2. Describe a small first task, like "add a `--version` flag." Plastic
|
|
86
|
+
scaffolds the intent file for you; never write it by hand.
|
|
87
|
+
3. Board it: say "continue." Plastic takes a lock, then asks "auto or guided?"
|
|
88
|
+
4. Say "auto." The agent runs Why, then How, then Exec in one pass, then
|
|
89
|
+
writes `outcome.md` with exactly what was delivered and moves the intent
|
|
90
|
+
to Completed.
|
|
91
|
+
|
|
92
|
+
Full guide: [your first intent in 10 minutes](docs/guides/your-first-intent-in-10-minutes.md).
|
|
93
|
+
</details>
|
|
94
|
+
|
|
95
|
+
## Two founding systems
|
|
124
96
|
|
|
125
|
-
|
|
97
|
+
**System for the Brain.** Plastic is built on the Zettelkasten method:
|
|
98
|
+
small, linked notes that add up to more than their sum. The name borrows
|
|
99
|
+
from neuroplasticity, the brain's own way of rewiring itself. An intent is
|
|
100
|
+
one such note. Its `sources` and `chain` links connect it to the intents
|
|
101
|
+
that shaped it and the ones it led to, so the store grows into a graph you
|
|
102
|
+
can navigate, not a pile of files.
|
|
126
103
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
104
|
+
**System for the Work.** Plastic separates the fixed part of work from the
|
|
105
|
+
creative part. The blueprint (conventions, templates, layout, and the
|
|
106
|
+
lifecycle stages) comes out the same shape no matter who does the work. The
|
|
107
|
+
thinking (what to build and how) stays free: a human or an agent does it,
|
|
108
|
+
and Plastic steers and checks that judgment without replacing it. One
|
|
109
|
+
readable shape for every intent, so any person or agent can pick up where
|
|
110
|
+
another left off.
|
|
111
|
+
|
|
112
|
+
## Plastic ships itself
|
|
113
|
+
|
|
114
|
+
Every release of Plastic is a set of intents that Plastic itself tracked,
|
|
115
|
+
planned, and delivered. Over 2026-07-06 and 2026-07-07, the stable-1.0
|
|
116
|
+
roadmap run cut six beta releases, beta.32 through beta.37, collecting 19
|
|
117
|
+
intents. The evidence is public in `CHANGELOG.md` and the roadmap:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
- `1.0.0-beta.19` - shipped 2026-06-25; collected 92 (plastic-humanizer skill: clean authored prose, remove AI tells and slop from docs/specs/outcomes/READMEs).
|
|
121
|
+
- `1.0.0-beta.3` - shipped; collected 74 (mandatory structured agent completion reports + deterministic fallback).
|
|
122
|
+
- [x] 129 First-run user guides — delivered
|
|
123
|
+
- [x] 109 Audit README against the PLASTIC implementation — delivered
|
|
124
|
+
- [x] 97 Implement the first-sight positioning (README + repo) — delivered
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
No other memory tool can paste this, because none is built with itself.
|
|
128
|
+
|
|
129
|
+
## How Plastic differs
|
|
130
|
+
|
|
131
|
+
Plastic is not a memory service. Tools like mem0 give an agent a vector
|
|
132
|
+
database to store and recall facts through an API, and that memory lives in
|
|
133
|
+
the service, apart from your project. Plastic keeps intents as plain,
|
|
134
|
+
git-tracked Markdown files, moved through an enforced lifecycle (What, Why,
|
|
135
|
+
How, Exec) that a person can read without any tooling.
|
|
136
|
+
|
|
137
|
+
Projects like beads add persistent memory on top of an existing agent
|
|
138
|
+
workflow. Plastic shares that goal but makes the intent itself, with its
|
|
139
|
+
spec, plan, and delivered outcome, the unit of work. It runs today with
|
|
140
|
+
Claude Code, and works with Cursor and Cline through the same conventions.
|
|
134
141
|
|
|
135
142
|
## Documentation
|
|
136
143
|
|
|
144
|
+
Each lifecycle stage has one dispatchable background agent, from discovery
|
|
145
|
+
through delivery, plus `plastic-enforcer` as the auto-mode orchestrator.
|
|
146
|
+
|
|
137
147
|
- [`docs/architecture.md`](docs/architecture.md): system structure, the two
|
|
138
|
-
processes, the store layout, and the
|
|
139
|
-
- [`docs/internals.md`](docs/internals.md): how Plastic stays deterministic
|
|
140
|
-
|
|
148
|
+
processes, the store layout, the component map, and the full stage table.
|
|
149
|
+
- [`docs/internals.md`](docs/internals.md): how Plastic stays deterministic
|
|
150
|
+
and how the harness works.
|
|
141
151
|
- [`docs/guides/`](docs/guides/index.md): task-oriented guides, from your
|
|
142
152
|
first intent in 10 minutes to picking a delivery mode.
|
|
143
153
|
|
|
144
154
|
## Conventions
|
|
145
155
|
|
|
146
156
|
Plastic conventions live in `PLASTIC.md`, distributed to `~/.plastic/PLASTIC.md`
|
|
147
|
-
and overwritten on every update. Project-specific rules live in `AGENTS.md
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
`plastic-doctor --core` runs a binary install-integrity check (compares files
|
|
151
|
-
against the install manifests; pass or error). `plastic-doctor --store` checks
|
|
152
|
-
store state (intents, INDEX sections, conventions) and can be scoped to
|
|
153
|
-
`global` or a project slug. The full `plastic-doctor` runs all checks and is
|
|
154
|
-
run automatically after every update.
|
|
157
|
+
and overwritten on every update. Project-specific rules live in `AGENTS.md`.
|
|
158
|
+
Run `plastic-doctor` to check installation health; it compares files against
|
|
159
|
+
the manifests, checks store state, and runs automatically after every update.
|
|
155
160
|
|
|
156
161
|
## License
|
|
157
162
|
|
|
158
163
|
MIT
|
|
164
|
+
|
|
165
|
+
Claude Code is powerful. Plastic makes it remember.
|
package/package.json
CHANGED
package/scripts/dashboard.rb
CHANGED
|
@@ -704,6 +704,16 @@ end
|
|
|
704
704
|
# CLI
|
|
705
705
|
# ---------------------------------------------------------------------------
|
|
706
706
|
|
|
707
|
+
# JSON.pretty_generate renders empty arrays/objects as multi-line ("[\n\n ]") on
|
|
708
|
+
# some json gem versions and single-line ("[]") on others, so the same payload
|
|
709
|
+
# serializes differently across environments. Collapse both to the single-line
|
|
710
|
+
# form so dashboard JSON output is byte-identical everywhere. The \n requirement
|
|
711
|
+
# in each pattern is what makes this safe: a raw newline is illegal inside a JSON
|
|
712
|
+
# string, so neither pattern can ever match inside string content.
|
|
713
|
+
def canonical_pretty_json(payload)
|
|
714
|
+
JSON.pretty_generate(payload).gsub(/\[\s*\n\s*\]/, "[]").gsub(/\{\s*\n\s*\}/, "{}")
|
|
715
|
+
end
|
|
716
|
+
|
|
707
717
|
def main(argv)
|
|
708
718
|
json = argv.delete("--json")
|
|
709
719
|
data = argv.delete("--data")
|
|
@@ -715,7 +725,7 @@ def main(argv)
|
|
|
715
725
|
|
|
716
726
|
if data
|
|
717
727
|
payload = mode == "project" ? render_data_project(records, slug) : render_data_global(records)
|
|
718
|
-
puts
|
|
728
|
+
puts canonical_pretty_json(payload)
|
|
719
729
|
return 0
|
|
720
730
|
end
|
|
721
731
|
|
|
@@ -729,7 +739,7 @@ def main(argv)
|
|
|
729
739
|
# per-scope boards (keeping the all-scopes auto-mode contract stable).
|
|
730
740
|
payload[:store_health] = store_health(slug) if mode == "project"
|
|
731
741
|
payload[:store_health] = store_health(:global) if mode == "continue"
|
|
732
|
-
puts
|
|
742
|
+
puts canonical_pretty_json(payload)
|
|
733
743
|
return 0
|
|
734
744
|
end
|
|
735
745
|
|