@zalom/plastic 1.0.0-alpha.2 → 1.0.0-alpha.21
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 +128 -473
- package/README.md +90 -58
- package/agents/future-intent-researcher.md +1 -1
- package/agents/intent-curator.md +1 -1
- package/bin/plastic.js +57 -0
- package/bin/test +28 -0
- package/deprecations.yml +7 -6
- package/hooks/auto-arm +5 -0
- package/hooks/bash-gate +3 -0
- package/hooks/check-update +12 -8
- package/hooks/code-gate +10 -0
- package/hooks/hooks.json +25 -4
- package/hooks/statusline +50 -10
- package/package.json +2 -2
- package/scripts/dashboard.rb +480 -0
- package/scripts/doctor.rb +973 -0
- package/scripts/hook-auto-arm +52 -0
- package/scripts/hook-bash-gate +53 -0
- package/scripts/hook-code-gate +39 -0
- package/scripts/hook-continue +15 -114
- package/scripts/hook-gate-check +19 -4
- package/scripts/hook-session-start +76 -31
- package/scripts/install.rb +91 -480
- package/scripts/lib/bridge.rb +255 -0
- package/scripts/lib/installer_core.rb +760 -0
- package/scripts/migrate-to-global +1 -1
- package/scripts/select-update-target +93 -0
- package/scripts/uninstall.rb +53 -0
- package/scripts/update.rb +142 -0
- package/scripts/versions.rb +141 -0
- package/skills/_active-intent-gate.md +26 -0
- package/skills/auto/SKILL.md +62 -9
- package/skills/auto/evals/evals.json +92 -0
- package/skills/auto/references/agent-architecture.md +60 -0
- package/skills/brainstorming/SKILL.md +143 -0
- package/skills/brainstorming-grill-me/SKILL.md +5 -5
- package/skills/continuing/SKILL.md +102 -77
- package/skills/continuing/evals/evals.json +136 -0
- package/skills/continuing/references/context-management.md +32 -0
- package/skills/creating-intent/SKILL.md +16 -1
- package/skills/creating-intent/references/lifecycle.md +74 -0
- package/skills/creating-intent/references/wikilinks.md +8 -0
- package/skills/creating-project/SKILL.md +8 -4
- package/skills/creating-project/references/hubs-projects.md +55 -0
- package/skills/dashboard/SKILL.md +92 -0
- package/skills/doctor/SKILL.md +116 -0
- package/skills/doctor/references/gates-stuck-detection.md +38 -0
- package/skills/doctor/report.md +96 -0
- package/skills/evaluating-skills/SKILL.md +140 -0
- package/skills/evaluating-skills/assets/eval-template.json +12 -0
- package/skills/evaluating-skills/evals/evals.json +75 -0
- package/skills/evaluating-skills/references/convention-checks.md +76 -0
- package/skills/evaluating-skills/references/eval-methodology.md +154 -0
- package/skills/executing-plan/SKILL.md +3 -3
- package/skills/install/SKILL.md +56 -8
- package/skills/intent-curator/SKILL.md +3 -3
- package/skills/linking-intents/SKILL.md +5 -1
- package/skills/linking-intents/references/zettelkasten.md +33 -0
- package/skills/managing-index/SKILL.md +5 -1
- package/skills/releasing/SKILL.md +119 -18
- package/skills/releasing/references/deprecations.md +44 -0
- package/skills/research/SKILL.md +114 -0
- package/skills/savepoint/SKILL.md +46 -37
- package/skills/savepoint/references/context-management.md +32 -0
- package/skills/uninstall/SKILL.md +39 -28
- package/skills/update/SKILL.md +41 -36
- package/skills/versions/SKILL.md +65 -0
- package/skills/writing-instructions/SKILL.md +159 -0
- package/skills/writing-instructions/references/agentskills-spec.md +135 -0
- package/skills/writing-plans/SKILL.md +183 -0
- package/templates/agents.md +16 -0
- package/templates/outcome.md +13 -0
- package/templates/project.yml +5 -0
- package/templates/savepoint.md +14 -13
- package/templates/spec.md +25 -0
- package/bin/install.js +0 -29
package/PLASTIC.md
CHANGED
|
@@ -4,26 +4,29 @@
|
|
|
4
4
|
> plugin is updated. Do not modify — your changes will be lost.
|
|
5
5
|
> For project-specific rules, use `AGENTS.md` instead.
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
## What is an Intent
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
A directory in the store containing `{ID}--{slug}.md` and optional supporting files.
|
|
11
10
|
It represents a desire — something a human or agent wants to accomplish, explore, or understand.
|
|
12
|
-
Intents are atomic thoughts that need to be developed.
|
|
13
11
|
|
|
14
12
|
```
|
|
15
13
|
store/
|
|
16
14
|
ID--three-to-five-words/
|
|
17
|
-
{ID}--{slug}.md
|
|
18
|
-
spec.md
|
|
19
|
-
plan.md
|
|
20
|
-
checklist.md
|
|
21
|
-
outcome.md
|
|
22
|
-
actions/
|
|
23
|
-
|
|
24
|
-
savepoint.md
|
|
15
|
+
{ID}--{slug}.md # required — the intent itself
|
|
16
|
+
spec.md # optional — specification (Why deliverable)
|
|
17
|
+
plan.md # optional — implementation plan (How deliverable)
|
|
18
|
+
checklist.md # optional — execution registry (How deliverable)
|
|
19
|
+
outcome.md # optional — detailed result (Exec deliverable)
|
|
20
|
+
actions/ # optional — individual work items
|
|
21
|
+
resources/ # optional — research, references, screenshots, diagrams
|
|
22
|
+
savepoint.md # optional — deterministic cycle-step ledger (auto-written)
|
|
25
23
|
```
|
|
26
24
|
|
|
25
|
+
Lifecycle files (`spec.md`, `plan.md`, `checklist.md`, `outcome.md`) have defined
|
|
26
|
+
roles. Supporting artifacts that aren't lifecycle deliverables — research reports,
|
|
27
|
+
reference docs, external API snapshots, screenshots, diagrams — go in `resources/`.
|
|
28
|
+
Name files inside as `{type}--{description}.md` (e.g., `deep-research--gsd-core.md`).
|
|
29
|
+
|
|
27
30
|
## Frontmatter
|
|
28
31
|
|
|
29
32
|
Identity and knowledge graph only. Nothing operational.
|
|
@@ -32,503 +35,155 @@ Identity and knowledge graph only. Nothing operational.
|
|
|
32
35
|
---
|
|
33
36
|
id: "4a1"
|
|
34
37
|
intent: "Short description of the desire"
|
|
35
|
-
sources: ["4a"] # backward links — what influenced this
|
|
36
|
-
chain: ["4a1a"
|
|
38
|
+
sources: ["4a"] # backward links — what influenced this
|
|
39
|
+
chain: ["4a1a"] # forward links — what this spawned
|
|
37
40
|
created: 2026-05-29
|
|
38
41
|
author: human # human | agent-name
|
|
39
42
|
tags: [plastic, architecture]
|
|
40
43
|
---
|
|
41
44
|
```
|
|
42
45
|
|
|
43
|
-
- `sources`
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
- IDs use Folgezettel format — the same identifier used in wikilinks and filenames
|
|
47
|
-
- No other fields. Everything else is derived from conventions.
|
|
46
|
+
- `sources` + `chain` form the double-linked knowledge graph (Folgezettel)
|
|
47
|
+
- IDs use Luhmann's alternating convention: `1` → `1a` → `1a1` → `1a1a`
|
|
48
|
+
- Multiple branches increment: `1a`, `1b`, `1c`
|
|
48
49
|
|
|
49
50
|
## Two Processes
|
|
50
51
|
|
|
51
|
-
Plastic has two nested processes:
|
|
52
|
-
|
|
53
52
|
| Process | Scope | Type | Actor |
|
|
54
53
|
|---|---|---|---|
|
|
55
54
|
| **Build → Observe → Repeat** | The system | Continuous loop | Coordinator |
|
|
56
55
|
| **What → Why → How → Exec** | One intent | Finite lifecycle | Agent |
|
|
57
56
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
### ## Insights — Append-only work log
|
|
101
|
-
|
|
102
|
-
Captured throughout ALL stages. One-liner bullet points.
|
|
103
|
-
Never modified, only appended.
|
|
104
|
-
|
|
105
|
-
Tracks: stage transitions, decisions, shifts, blocks, cancellations, material for future intents.
|
|
106
|
-
This is how execution is tracked. When this intent completes, Insights
|
|
107
|
-
is where to look for what comes next. New intents spawned from Insights
|
|
108
|
-
appear in the `chain` field.
|
|
109
|
-
|
|
110
|
-
### ## Links
|
|
111
|
-
|
|
112
|
-
Wikilinks for Obsidian graph navigation. Human-facing counterpart to the
|
|
113
|
-
frontmatter knowledge graph.
|
|
114
|
-
|
|
115
|
-
## Conventions — Filesystem as Schema
|
|
116
|
-
|
|
117
|
-
State is derived from what exists, not from what's declared.
|
|
118
|
-
|
|
119
|
-
| Convention | Signal |
|
|
120
|
-
|---|---|
|
|
121
|
-
| No `## Context` | Intent is fleeting (quick capture, non-actionable) |
|
|
122
|
-
| `## Context` has content | Intent is permanent (developed, actionable) |
|
|
123
|
-
| `## Outcome` has content | Intent is done |
|
|
124
|
-
| `## Insights` has `(autonomous)` entries | Intent is/was being delivered autonomously |
|
|
125
|
-
|
|
126
|
-
### Transitions
|
|
127
|
-
|
|
128
|
-
- Fleeting → permanent: add `## Context` (one-way, also makes it actionable)
|
|
129
|
-
- There is no separate "non-actionable → actionable" transition — permanence implies actionability
|
|
130
|
-
- Even research intents are actionable: the research itself is the action, the conclusion is the outcome
|
|
131
|
-
|
|
132
|
-
### Actions
|
|
133
|
-
|
|
134
|
-
When an intent becomes permanent, it is actionable. Create `actions/` with:
|
|
135
|
-
- `ACTION_N.md` — individual work items, each self-contained with all resources and context from plan.md
|
|
136
|
-
- `CHECKLIST.md` — execution registry tracking progress; serves as the savepoint of execution
|
|
137
|
-
|
|
138
|
-
Status lives on actions, not on the intent. An intent can have multiple
|
|
139
|
-
parallel workstreams.
|
|
57
|
+
B→O→R is the Coordinator's heartbeat. W→W→H→E is what happens inside each intent.
|
|
58
|
+
The connection: an intent's `## Insights` feeds the Coordinator's Observe phase.
|
|
59
|
+
|
|
60
|
+
## Lifecycle Stages
|
|
61
|
+
|
|
62
|
+
| Stage | Section | Deliverable | Detail |
|
|
63
|
+
|-------|---------|-------------|--------|
|
|
64
|
+
| **What** | `## Intent` | `{ID}--{slug}.md` | `plastic-creating-intent` |
|
|
65
|
+
| **Why** | `## Context` + Decisions | `spec.md` | `plastic-brainstorming` |
|
|
66
|
+
| **How** | Planning | `plan.md` + `actions/` + `checklist.md` | `plastic-writing-plans` |
|
|
67
|
+
| **Exec** | Execution | `outcome.md` | `plastic-executing-plan` |
|
|
68
|
+
|
|
69
|
+
`## Insights` — append-only work log captured throughout ALL stages. **Append-only means
|
|
70
|
+
newest entry at the bottom; never prepend.** This ordering is a hard convention: Insights
|
|
71
|
+
are the semantic trace of an intent, and a consistent newest-last order keeps that trace
|
|
72
|
+
readable across every intent.
|
|
73
|
+
For full lifecycle detail, the skills in the Detail column have references/.
|
|
74
|
+
|
|
75
|
+
`savepoint.md` — a deterministic, append-only ledger of cycle-step milestones (one line per
|
|
76
|
+
lifecycle boundary, newest at the bottom), written automatically by the gate hook. It is
|
|
77
|
+
sugar on top of the conventions, not a source of truth: state is always derivable from
|
|
78
|
+
files-on-disk, and the ledger is rebuildable. It exists so a resuming agent reads the cycle's
|
|
79
|
+
succession at a glance (last line = where we are).
|
|
80
|
+
|
|
81
|
+
## Gotchas
|
|
82
|
+
|
|
83
|
+
- **Artifacts go in the intent directory.** Never create `docs/plans/`,
|
|
84
|
+
`docs/specs/`, `researches/`, or similar. All meta-artifacts go in
|
|
85
|
+
`~/.plastic/store/ID--slug/` or the project store equivalent.
|
|
86
|
+
- **Code goes in the project. Everything else goes in the intent.**
|
|
87
|
+
Plans, specs, checklists, savepoints — all in the intent directory.
|
|
88
|
+
- **The global store is never pushed.** `~/.plastic/` is git-tracked locally
|
|
89
|
+
but contains sensitive data. Never push to a remote.
|
|
90
|
+
- **Agent-created repos are private by default.** Use `gh repo create --private`.
|
|
91
|
+
- **State is derived from what exists.** No `## Context` = fleeting intent.
|
|
92
|
+
`## Context` exists = permanent/actionable. `## Outcome` exists = done.
|
|
93
|
+
- **Status lives on actions, not intents.** An intent can have parallel workstreams.
|
|
94
|
+
- **`outcome.md` = done.** Presence signals completion. Don't write it until
|
|
95
|
+
checklist is fully checked.
|
|
96
|
+
- **Delegation overrides external skill defaults.** When delegating to
|
|
97
|
+
brainstorming, writing-plans, etc., Plastic's directory rules override
|
|
98
|
+
their default output paths.
|
|
140
99
|
|
|
141
100
|
## State System
|
|
142
101
|
|
|
143
|
-
Global mode (default):
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
~/.plastic/ # Global intent store
|
|
147
|
-
├── AGENTS.md # This file — conventions contract
|
|
148
|
-
├── config.yml # User preferences
|
|
149
|
-
├── projects.yml # Project slug → path registry
|
|
150
|
-
├── INDEX.md # Brain's entry point
|
|
151
|
-
└── store/
|
|
152
|
-
└── ID--three-to-five-words/ # One directory per strategic intent
|
|
153
|
-
├── {ID}--{slug}.md # The intent (always present, e.g., 1a1--design-plastic.md)
|
|
154
|
-
├── spec.md # Consolidated specification (optional — Why deliverable)
|
|
155
|
-
├── plan.md # Implementation plan (optional — How deliverable)
|
|
156
|
-
├── checklist.md # Execution registry with checkboxes (optional — How deliverable)
|
|
157
|
-
├── outcome.md # Detailed result (optional — Exec deliverable)
|
|
158
|
-
└── savepoint.md # Session state for resume (optional)
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
Per-project store (centralized under `~/.plastic/projects/`):
|
|
162
|
-
|
|
163
102
|
```
|
|
164
|
-
~/.plastic/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
103
|
+
~/.plastic/ # Global intent store (git, never pushed)
|
|
104
|
+
├── INDEX.md # Structure note (clusters by meaning)
|
|
105
|
+
├── config.yml # User preferences
|
|
106
|
+
├── projects.yml # Project slug → path registry
|
|
107
|
+
└── store/ # Strategic intents
|
|
108
|
+
└── ID--slug/
|
|
109
|
+
└── {ID}--{slug}.md
|
|
110
|
+
|
|
111
|
+
~/.plastic/projects/{slug}/ # Project-scoped store
|
|
112
|
+
├── INDEX.md # Project-scoped index
|
|
113
|
+
├── AGENTS.md # Project stack defaults
|
|
114
|
+
└── store/ # Tactical intents
|
|
115
|
+
└── ID--slug/
|
|
168
116
|
```
|
|
169
117
|
|
|
170
|
-
Project stores
|
|
171
|
-
|
|
172
|
-
by matching CWD against `projects.yml` and loads the appropriate store automatically.
|
|
173
|
-
|
|
174
|
-
### Privacy and Collaboration
|
|
175
|
-
|
|
176
|
-
**Plastic is personal.** All intent data lives under `~/.plastic/` — one location, one git repo, never pushed. Each person has their own intent store with their own thought evolution. No files are placed in project directories.
|
|
177
|
-
|
|
178
|
-
Collaboration happens through pull requests and project conventions, not shared intents. When an intent delivers something that changes how a project works, the decision gets written into the project's shared files (README, docs, config). The intents themselves are private working memory.
|
|
179
|
-
|
|
180
|
-
Project config (`~/.plastic/projects/{slug}/config.yml`) overrides global config (`~/.plastic/config.yml`). Both are private.
|
|
181
|
-
|
|
182
|
-
### Directory Naming — Folgezettel
|
|
183
|
-
|
|
184
|
-
Format: `ID--three-to-five-words` — applies to all stores.
|
|
185
|
-
- `ID` — Folgezettel identifier using Luhmann's alternating convention
|
|
186
|
-
- `--` — separator
|
|
187
|
-
- `three-to-five-words` — human-readable slug (3-5 words max)
|
|
188
|
-
|
|
189
|
-
Folgezettel IDs encode lineage:
|
|
190
|
-
- Root intents: sequential numbers (`1`, `2`, `3`...)
|
|
191
|
-
- Branches alternate letters and numbers: `1` → `1a` → `1a1` → `1a1a` → ...
|
|
192
|
-
- Multiple branches from the same parent increment: `1a`, `1b`, `1c` or `1a1`, `1a2`, `1a3`
|
|
193
|
-
- IDs are assigned at creation time and never change
|
|
118
|
+
Project stores derived from `projects.yml`. No files placed in project code
|
|
119
|
+
directories. SessionStart hook detects project by matching CWD.
|
|
194
120
|
|
|
195
|
-
|
|
121
|
+
**Privacy:** Plastic is personal. All intent data under `~/.plastic/`. Each
|
|
122
|
+
person has their own store. Collaboration through PRs, not shared intents.
|
|
196
123
|
|
|
197
|
-
|
|
198
|
-
Wikilinks use the ID only (`[[1a1]]`) and resolve via Obsidian alias or search.
|
|
124
|
+
## Directory Naming
|
|
199
125
|
|
|
200
|
-
|
|
201
|
-
- Directory `1a1--design-plastic-state-system/` contains `1a1--design-plastic-state-system.md`
|
|
202
|
-
- Directory `4a1b--lifecycle-file-mapping/` contains `4a1b--lifecycle-file-mapping.md`
|
|
126
|
+
Format: `ID--three-to-five-words` (all stores).
|
|
203
127
|
|
|
204
|
-
|
|
128
|
+
- Root intents: sequential numbers (`1`, `2`, `3`)
|
|
129
|
+
- Branches alternate: `1` → `1a` → `1a1` → `1a1a`
|
|
130
|
+
- Intent file matches directory: `1a1--slug/1a1--slug.md`
|
|
131
|
+
- Next ID: `"${CLAUDE_PLUGIN_ROOT}/scripts/folgezettel-id" <parent_id> <store_path>`
|
|
205
132
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
| `[[ID]]` | Link to intent in same store (e.g., `[[1a1]]`) |
|
|
209
|
-
| `[[ID\|display text]]` | Link with human-readable label (e.g., `[[1a1\|Design Plastic]]`) |
|
|
210
|
-
| `[[global:ID]]` | Link to intent in `~/.plastic/store/` |
|
|
211
|
-
| `[[project-slug:ID]]` | Link to intent in `~/.plastic/projects/{slug}/store/` |
|
|
133
|
+
**Branch vs root — the semantic decision.** The numbering is mechanics; choosing
|
|
134
|
+
*whether* to branch is meaning:
|
|
212
135
|
|
|
213
|
-
|
|
136
|
+
- **Branch (`14a`, `14b`)** — a sub-task, refinement, or direct continuation of the
|
|
137
|
+
parent. It cannot stand on its own; it only makes sense as part of the parent's work.
|
|
138
|
+
- **Root (`15`, `16`)** — an independent thought, even if inspired by another intent.
|
|
139
|
+
Record provenance with `sources: ["14"]`, not by branching.
|
|
140
|
+
- **Rule of thumb:** if the intent could exist without its parent, it's a root.
|
|
214
141
|
|
|
215
|
-
|
|
142
|
+
## INDEX.md
|
|
216
143
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
INDEX.md is a Zettelkasten structure note, not a table of contents.
|
|
220
|
-
It clusters intents by meaning, not by date or status.
|
|
144
|
+
A Zettelkasten structure note, not a table of contents. Clusters by meaning.
|
|
221
145
|
|
|
222
146
|
Sections: `## Active`, `## Future`, `## Clusters`, `## Abandoned`, `## Completed`.
|
|
223
147
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
1. Determine the target store: `~/.plastic/store/` for global intents (default), `~/.plastic/projects/{slug}/store/` for project intents
|
|
227
|
-
2. Determine the Folgezettel ID: If root (no parent), find highest root number +1. If branch, run `"${CLAUDE_PLUGIN_ROOT}/scripts/folgezettel-id" <parent_id> <store_path>`
|
|
228
|
-
3. Create the intent directory in the chosen store (e.g., `ID--three-to-five-words`)
|
|
229
|
-
4. Create `{ID}--{slug}.md` with frontmatter (id, intent, sources, chain, created, author, tags)
|
|
230
|
-
5. Write `## Intent` — the What
|
|
231
|
-
6. Add remaining sections: `## Context`, `## Outcome`, `## Insights`, `## Links`
|
|
232
|
-
7. Update the appropriate `INDEX.md` — add to Active section and appropriate cluster
|
|
233
|
-
|
|
234
|
-
A fleeting intent can skip `## Context` — just `## Intent` and empty sections.
|
|
235
|
-
|
|
236
|
-
## Progressing an Intent
|
|
237
|
-
|
|
238
|
-
1. **What → Why:** Brainstorm, explore, grill. Add Context + Decisions to `## Context`. Write `spec.md`.
|
|
239
|
-
- **Autonomous handoff:** When Why is complete, human can invoke `plastic:auto` to hand off How and Exec to the agent. The agent completes any remaining Why gaps through self-directed research, then proceeds through How and Exec autonomously.
|
|
240
|
-
2. **Why → How:** Research decisions, plan. Write `plan.md`, create `actions/`, write `checklist.md`.
|
|
241
|
-
3. **How → Exec:** Execute actions, update `checklist.md`. When all done, write `outcome.md`.
|
|
242
|
-
4. **Throughout:** Capture observations in `## Insights` (append-only). These spark future intents.
|
|
243
|
-
5. **Completing:** Write `## Outcome` summary in intent.md. Spawn follow-up intents from `## Insights`, update `chain`.
|
|
244
|
-
|
|
245
|
-
## Context Management (Start-Save-Continue)
|
|
246
|
-
|
|
247
|
-
### Save Point
|
|
248
|
-
Triggered by PreCompact hook or manually:
|
|
249
|
-
1. Find active intent(s) from `~/.plastic/INDEX.md`
|
|
250
|
-
2. Update active intent's `checklist.md` (check off completed items)
|
|
251
|
-
3. Update active intent's `savepoint.md` (in-progress, next steps, blockers, discoveries)
|
|
252
|
-
4. Add observations to `## Insights`
|
|
253
|
-
5. Update INDEX.md
|
|
254
|
-
6. Commit: `cd ~/.plastic && git add . && git commit -m "chore: savepoint — [intent name]"`
|
|
255
|
-
7. Notify user to `/clear`
|
|
256
|
-
|
|
257
|
-
### Continue
|
|
258
|
-
Triggered by UserPromptSubmit hook when user says "continue". Priority order:
|
|
259
|
-
|
|
260
|
-
**1. Active intents first (resume work):**
|
|
261
|
-
1. Read INDEX.md → find active intent(s)
|
|
262
|
-
2. Read active intent's `intent.md` → what and why
|
|
263
|
-
3. Read active intent's `savepoint.md` → where we left off
|
|
264
|
-
4. Read active intent's `checklist.md` → what's next
|
|
265
|
-
5. Announce: intent name, current state, next step, blockers
|
|
266
|
-
6. Resume
|
|
267
|
-
|
|
268
|
-
**2. No active intents → offer future intents:**
|
|
269
|
-
1. List all future intents from INDEX.md
|
|
270
|
-
2. Present them as options
|
|
271
|
-
3. When user picks one, move to Active in INDEX.md
|
|
272
|
-
|
|
273
|
-
**3. Stale future intents (untouched 3+ days) → triage:**
|
|
274
|
-
- **activate** — start working on it now
|
|
275
|
-
- **abandon** — mark as abandoned
|
|
276
|
-
- **defer to agent** — implement, research, or ideate
|
|
148
|
+
For index maintenance, use `plastic-managing-index`.
|
|
277
149
|
|
|
278
150
|
## Rules for Skills
|
|
279
151
|
|
|
280
|
-
ALL work flows through intents.
|
|
281
|
-
|
|
282
|
-
1. **Before starting any work**, check INDEX.md for the active intent. If none exists, create one first.
|
|
283
|
-
2. **Never create** `docs/superpowers/specs/`, `docs/plans/`, `researches/`, or similar directories. All artifacts go into the active intent's directory.
|
|
284
|
-
3. **When a skill produces output** (spec, plan, checklist), write it inside the active intent's directory.
|
|
285
|
-
4. **When a skill completes**, capture observations in `## Insights`.
|
|
286
|
-
5. **When work is done**, write `outcome.md` and `## Outcome` summary in intent.md (presence of `outcome.md` = done). Update INDEX.md.
|
|
287
|
-
6. **Researches are intents.** No separate folder.
|
|
288
|
-
|
|
289
|
-
### Delegation to External Skills
|
|
290
|
-
|
|
291
|
-
When Plastic delegates to an external skill, **Plastic's directory rules OVERRIDE the external skill's defaults:**
|
|
292
|
-
|
|
293
|
-
- Plans save to `~/.plastic/store/ID--slug/plan.md` (not `docs/superpowers/plans/`)
|
|
294
|
-
- Specs save to `~/.plastic/store/ID--slug/spec.md` (not `docs/superpowers/specs/`)
|
|
295
|
-
- Code files go in the project tree; meta-artifacts go in the intent directory
|
|
296
|
-
|
|
297
|
-
**The rule is simple:** code goes in the project. Plans, specs, checklists, savepoints, and all meta-artifacts go in the intent directory. No exceptions.
|
|
298
|
-
|
|
299
|
-
## Hubs
|
|
300
|
-
|
|
301
|
-
A Hub is a cloud of intents around related topics. Hubs emerge naturally from
|
|
302
|
-
Folgezettel branching — intents that spawn in the same direction (same concept,
|
|
303
|
-
new ideas, new features) cluster into a Hub.
|
|
152
|
+
ALL work flows through intents.
|
|
304
153
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
154
|
+
1. Before starting work, check INDEX.md for active intent. If none, create one.
|
|
155
|
+
2. Skill output (spec, plan, checklist) goes in the intent directory.
|
|
156
|
+
3. On completion, capture observations in `## Insights`.
|
|
157
|
+
4. When done, write `outcome.md` + `## Outcome` summary. Update INDEX.md.
|
|
158
|
+
5. Researches are intents. No separate folder.
|
|
310
159
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
## Projects
|
|
314
|
-
|
|
315
|
-
A Project is a deliverable grouping of intents — a hub that connects related work into something that can be delivered. Projects have two stores, both under `~/.plastic/`:
|
|
316
|
-
|
|
317
|
-
- **Global store** (`~/.plastic/store/`): strategic intents — ideas, research, explorations that span multiple projects or don't belong to any project.
|
|
318
|
-
- **Project store** (`~/.plastic/projects/{slug}/store/`): project-scoped intents — implementation, actions, execution, delivery artifacts.
|
|
319
|
-
|
|
320
|
-
No files are placed in project code directories. The SessionStart hook detects the project by matching CWD against `projects.yml` and loads the appropriate store.
|
|
321
|
-
|
|
322
|
-
`projects.yml` maps project slugs to codebase paths:
|
|
323
|
-
```yaml
|
|
324
|
-
projects:
|
|
325
|
-
plastic:
|
|
326
|
-
path: "/path/to/plastic"
|
|
327
|
-
remote: "git@github.com:org/plastic.git"
|
|
328
|
-
registered: '2026-05-26'
|
|
329
|
-
status: active
|
|
330
|
-
```
|
|
160
|
+
## Transition Gates
|
|
331
161
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
Config resolution: `~/.plastic/projects/{slug}/config.yml` overrides `~/.plastic/config.yml`.
|
|
335
|
-
|
|
336
|
-
Cross-linking: project intents reference global intents via `[[global:ID]]`. Global intents reference project intents via `[[project-slug:ID]]`.
|
|
337
|
-
|
|
338
|
-
## Agent Architecture
|
|
339
|
-
|
|
340
|
-
### Main Orchestrator
|
|
341
|
-
|
|
342
|
-
The Main Orchestrator manages the global store (Main Knowledge Base). It:
|
|
343
|
-
- Recognizes, creates, updates, and groups intents
|
|
344
|
-
- Spawns Project Orchestrators for registered projects
|
|
345
|
-
- Receives contributions back from Project Orchestrators
|
|
346
|
-
- Is the only agent that runs in a loop (continuous Build→Observe→Repeat)
|
|
347
|
-
|
|
348
|
-
### Project Orchestrators
|
|
349
|
-
|
|
350
|
-
Project Orchestrators manage project stores (Project Knowledge Bases). They:
|
|
351
|
-
- Care about intents and execution within their project
|
|
352
|
-
- Spawn teams to develop and execute intents
|
|
353
|
-
- Contribute back to the Main Orchestrator when new intents are born
|
|
354
|
-
that could enrich the Main Knowledge Base
|
|
355
|
-
|
|
356
|
-
The Main Orchestrator and Project Orchestrators can be any agent platform: Claude Code, Hermes, OpenClaw.
|
|
357
|
-
Agents and sub-agents can also be any platform.
|
|
358
|
-
|
|
359
|
-
Two modes:
|
|
360
|
-
- **Human-driven:** Human chats with Main Orchestrator, creates intents, brainstorms, then Main Orchestrator dispatches Project Orchestrators and Agents for execution.
|
|
361
|
-
- **Autonomous:** Human gives Main Orchestrator a starting intent with defined outcomes. Main Orchestrator runs the full cycle — Agents do the lifecycle (What→Why→How→Exec), Main Orchestrator reviews Insights, spawns next intents, dispatches again. Human is the boss but doesn't need to be in the loop for every decision.
|
|
362
|
-
|
|
363
|
-
Rules:
|
|
364
|
-
- 1 Main Orchestrator : 1 Global Store (`~/.plastic/`)
|
|
365
|
-
- 1 Main Orchestrator : N Project Orchestrators
|
|
366
|
-
- 1 Project Orchestrator : 1 Project Store
|
|
367
|
-
- 1 Agent : 1 Intent (exclusive assignment)
|
|
368
|
-
- 1 Agent : N Sub-agents (for parallel Actions within an intent)
|
|
369
|
-
|
|
370
|
-
When "work on Project X":
|
|
371
|
-
1. Read `projects.yml` → find project path
|
|
372
|
-
2. Load global config (defaults)
|
|
373
|
-
3. Load project config (overrides)
|
|
374
|
-
4. Load global INDEX.md → find hub intents tagged `project-<name>`
|
|
375
|
-
5. Load project `.plastic/INDEX.md` → tactical intents
|
|
376
|
-
6. Coordinator has full picture, dispatches Agent teams
|
|
377
|
-
|
|
378
|
-
The Coordinator runs **Build → Observe → Repeat**:
|
|
379
|
-
1. **Build** — dispatch intent to an Agent
|
|
380
|
-
2. **Observe** — Agent completes, Coordinator reads ## Insights and ## Outcome
|
|
381
|
-
3. **Repeat** — spawn new intents from Insights, update chain, dispatch next
|
|
382
|
-
|
|
383
|
-
Each Agent runs **What → Why → How → Exec** on its assigned intent:
|
|
384
|
-
1. Receives intent from Coordinator
|
|
385
|
-
2. Handles full lifecycle: What→Why→How→Exec
|
|
386
|
-
3. Can spawn sub-agents for parallel Actions
|
|
387
|
-
4. When done: notifies Coordinator (triggers Observe phase)
|
|
388
|
-
|
|
389
|
-
### Autonomous Delivery
|
|
390
|
-
|
|
391
|
-
Human owns What and Why for human-initiated intents. Agent assists (research,
|
|
392
|
-
exploration) but human drives until handoff. When Why is complete — or human
|
|
393
|
-
triggers `plastic:auto` — the agent takes over How and Exec autonomously.
|
|
394
|
-
|
|
395
|
-
- **Safe-by-default:** Agent always prefers non-destructive routes (rename vs
|
|
396
|
-
delete, additive migrations, backups before changes). Destructive actions on
|
|
397
|
-
existing projects require human approval unless `--skip-permissions` is set.
|
|
398
|
-
- **One agent per intent.** Agent follows the full W→W→H→E lifecycle.
|
|
399
|
-
- **Notification only on:** finish or hard stop (blocked on destructive action,
|
|
400
|
-
unresolvable error). No progress reports — `## Insights` tracks everything.
|
|
401
|
-
- **Greenfield autonomy:** During initial project creation, all decisions are
|
|
402
|
-
non-destructive (nothing to destroy). Agent has full autonomy for greenfield choices.
|
|
403
|
-
- **Autonomous decisions** are logged in `## Insights` with `(autonomous)` marker.
|
|
404
|
-
|
|
405
|
-
## Hook Enforcement
|
|
406
|
-
|
|
407
|
-
Hooks are the convention enforcement layer. The agent reads PLASTIC.md for understanding; hooks enforce it.
|
|
408
|
-
|
|
409
|
-
### Bridge File Pattern
|
|
410
|
-
|
|
411
|
-
`/tmp/plastic-{session}.json` is the hot cache; the filesystem is the authority.
|
|
412
|
-
SessionStart rebuilds the bridge file from the filesystem — the bridge is always disposable.
|
|
413
|
-
|
|
414
|
-
### Gate Taxonomy
|
|
415
|
-
|
|
416
|
-
| Gate type | Purpose |
|
|
417
|
-
|---|---|
|
|
418
|
-
| **Pre-flight** | Prerequisites exist? (e.g., spec.md before plan.md) |
|
|
419
|
-
| **Revision** | New info invalidated prior work? (e.g., Context changed after spec.md was written) |
|
|
420
|
-
| **Escalation** | Blocked items surface to user (e.g., unresolved decision needed) |
|
|
421
|
-
| **Abort** | Inconsistent state detected (e.g., outcome.md exists but checklist incomplete) |
|
|
422
|
-
|
|
423
|
-
### Transition Table
|
|
424
|
-
|
|
425
|
-
| Transition | Trigger |
|
|
426
|
-
|---|---|
|
|
427
|
-
| What → Why | `spec.md` written |
|
|
428
|
-
| Why → How | `plan.md` + `actions/` + `checklist.md` written (the triplet) |
|
|
429
|
-
| How → Exec | `checklist.md` has items to execute |
|
|
430
|
-
| Exec → Done | `outcome.md` written |
|
|
431
|
-
|
|
432
|
-
### Gate Enforcement
|
|
433
|
-
|
|
434
|
-
| Gate | Blocked action | Required prerequisite |
|
|
435
|
-
|---|---|---|
|
|
436
|
-
| Pre-flight | Cannot write `plan.md` | `spec.md` must exist |
|
|
437
|
-
| Pre-flight | Cannot create `actions/` | `spec.md` must exist |
|
|
438
|
-
| Pre-flight | Cannot write `outcome.md` | `checklist.md` must exist with all items checked |
|
|
439
|
-
| Revision | Cannot proceed to Exec | Context changed after spec.md — re-derive spec |
|
|
440
|
-
| Abort | Cannot complete intent | `outcome.md` exists but checklist has unchecked items |
|
|
441
|
-
|
|
442
|
-
Hard blocking — hooks exit with code 2 when gates fail.
|
|
443
|
-
|
|
444
|
-
## Stuck Detection
|
|
445
|
-
|
|
446
|
-
| Condition | Threshold | Action |
|
|
162
|
+
| Transition | Trigger | Gate |
|
|
447
163
|
|---|---|---|
|
|
448
|
-
|
|
|
449
|
-
|
|
|
450
|
-
|
|
|
451
|
-
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
|
462
|
-
|
|
463
|
-
|
|
|
464
|
-
|
|
|
465
|
-
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
No special tooling required for either mode.
|
|
476
|
-
|
|
477
|
-
## Git Rules
|
|
478
|
-
|
|
479
|
-
The global store (`~/.plastic/`) is tracked with git locally but **never pushed
|
|
480
|
-
to a remote**. It contains sensitive data (intents, decisions, project context).
|
|
481
|
-
|
|
482
|
-
- `~/.plastic/`: git tracked, **never push**
|
|
483
|
-
- Project repos: push only when the user explicitly confirms
|
|
484
|
-
- Agent-created repos: **private by default**. When an agent creates a GitHub
|
|
485
|
-
repository (e.g., for a new project), it must be private unless the user
|
|
486
|
-
explicitly requests public. Use `gh repo create --private`.
|
|
487
|
-
|
|
488
|
-
## Deprecation Process
|
|
489
|
-
|
|
490
|
-
When removing a feature, changing a convention, or making a breaking change:
|
|
491
|
-
|
|
492
|
-
1. Add entry to `deprecations.yml` in the Plastic source root
|
|
493
|
-
2. Set appropriate severity: `info` (awareness), `warning` (action needed), `critical` (urgent)
|
|
494
|
-
3. Provide clear migration steps — never deprecate without telling the user what to do
|
|
495
|
-
4. Set `removal` version at least 2 minor versions ahead (warning) or 1 minor (info)
|
|
496
|
-
5. The SessionStart hook displays active deprecations automatically
|
|
497
|
-
6. Remove the feature AND the deprecation entry together in the removal version
|
|
498
|
-
|
|
499
|
-
### Severity Levels
|
|
500
|
-
|
|
501
|
-
| Severity | When to use | Dismissable? |
|
|
502
|
-
|----------|-------------|--------------|
|
|
503
|
-
| `info` | Awareness of upcoming change | Yes |
|
|
504
|
-
| `warning` | Action needed before removal | Yes (re-shown at removal version) |
|
|
505
|
-
| `critical` | Urgent/security-related removal | Never |
|
|
506
|
-
|
|
507
|
-
### deprecations.yml Schema
|
|
508
|
-
|
|
509
|
-
```yaml
|
|
510
|
-
deprecations:
|
|
511
|
-
- id: unique-slug
|
|
512
|
-
severity: info | warning | critical
|
|
513
|
-
summary: "One-line description"
|
|
514
|
-
migration_steps:
|
|
515
|
-
- "Step 1"
|
|
516
|
-
- "Step 2"
|
|
517
|
-
introduced: "0.9.0"
|
|
518
|
-
removal: "1.0.0"
|
|
519
|
-
link: "optional URL"
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
### Dismissal
|
|
523
|
-
|
|
524
|
-
Users dismiss deprecations by adding the id to `deprecations_dismissed` in `config.yml`:
|
|
525
|
-
|
|
526
|
-
```yaml
|
|
527
|
-
deprecations_dismissed:
|
|
528
|
-
- some-deprecated-feature
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
Critical deprecations and final-version warnings ignore dismissal.
|
|
532
|
-
|
|
533
|
-
## Agent-Specific Files
|
|
534
|
-
|
|
164
|
+
| What → Why | `spec.md` written | — |
|
|
165
|
+
| Why → How | `plan.md` + `actions/` + `checklist.md` | `spec.md` must exist |
|
|
166
|
+
| How → Exec | Checklist has items | Plan triplet must exist |
|
|
167
|
+
| Exec → Done | `outcome.md` written | All checklist items checked |
|
|
168
|
+
|
|
169
|
+
Hard blocking — hooks exit code 2 on gate failure.
|
|
170
|
+
|
|
171
|
+
## Skills Reference
|
|
172
|
+
|
|
173
|
+
Detailed conventions live inside the skills that use them, not in this file.
|
|
174
|
+
|
|
175
|
+
| Topic | Skill | References in skill |
|
|
176
|
+
|-------|-------|-------------------|
|
|
177
|
+
| Creating intents, lifecycle | `plastic-creating-intent` | lifecycle, wikilinks |
|
|
178
|
+
| Brainstorming, spec writing | `plastic-brainstorming` | — |
|
|
179
|
+
| Planning, actions | `plastic-writing-plans` | — |
|
|
180
|
+
| Execution, delivery | `plastic-executing-plan` | — |
|
|
181
|
+
| Autonomous delivery | `plastic-auto` | agent architecture |
|
|
182
|
+
| Save/restore state | `plastic-savepoint`, `plastic-continuing` | context management |
|
|
183
|
+
| Knowledge graph, linking | `plastic-linking-intents` | zettelkasten, wikilinks |
|
|
184
|
+
| Projects, hubs | `plastic-creating-project` | hubs, project stores |
|
|
185
|
+
| Index maintenance | `plastic-managing-index` | — |
|
|
186
|
+
| Releases, deprecations | `plastic-releasing` | deprecation process |
|
|
187
|
+
| Health diagnostics | `plastic-doctor` | gate enforcement, stuck detection |
|
|
188
|
+
| Writing agent instructions | `plastic-writing-instructions` | agentskills.io spec |
|
|
189
|
+
| Evaluating skills, evals | `plastic-evaluating-skills` | eval methodology, convention checks |
|