@zalom/plastic 2.0.0-alpha.8 → 2.0.1
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 +13 -136
- package/README.md +357 -133
- package/agents/plastic-enforcer.md +20 -15
- package/agents/plastic-executor.md +15 -4
- package/agents/plastic-node-research.md +30 -0
- package/agents/plastic-node-verify.md +28 -0
- package/agents/plastic-node-work.md +33 -0
- package/agents/{plastic-advisor.md → plastic-primary-advisor.md} +7 -9
- package/agents/{plastic-faux-advisor.md → plastic-secondary-advisor.md} +9 -12
- package/assets/plastic-logo.svg +1 -0
- package/bin/crap +4 -0
- package/bin/lib/context_budget.rb +43 -6
- package/bin/lib/skill_census.rb +839 -0
- package/bin/plastic +6 -0
- package/bin/plastic-skill-census +114 -0
- package/bin/test +24 -4
- package/bin/verify-change +345 -0
- package/config_asks.yml +4 -4
- package/deprecations.yml +1 -1
- package/{skills/agent-advisor/references → docs/help}/advisor-protocol.md +19 -24
- package/{skills/auto/references → docs/help}/agent-architecture.md +16 -14
- package/{skills/conventions/references → docs/help}/completion-and-done.md +15 -16
- package/docs/help/human-report-contract.md +152 -0
- package/{skills/conventions/references → docs/help}/knowledge-graph.md +9 -0
- package/{skills/conventions/references → docs/help}/locks-and-worktrees.md +23 -13
- package/{skills/conventions/references → docs/help}/maintenance-and-revisions.md +1 -1
- package/{skills/conventions/references → docs/help}/roadmaps.md +2 -2
- package/{skills/tutorial/references → docs/help}/track-1-guided.md +28 -47
- package/{skills/tutorial/references → docs/help}/track-2-auto.md +8 -8
- package/{skills/tutorial/references → docs/help}/track-3-projects-and-roadmaps.md +24 -17
- package/hooks/call-budget +4 -0
- package/hooks/hooks.json +24 -0
- package/hooks/message-display +62 -1
- package/hooks/session-start +5 -1
- package/hooks/statusline +32 -27
- package/hooks/stop +5 -0
- package/package.json +5 -3
- package/scripts/append-ledger +2 -1
- package/scripts/dashboard.rb +267 -16
- package/scripts/day-summary +2 -1
- package/scripts/doctor.rb +680 -39
- package/scripts/end-intent +238 -22
- package/scripts/exec-worktree +5 -5
- package/scripts/file-session-intent +2 -1
- package/scripts/graph-measure +249 -0
- package/scripts/hook-call-budget +222 -0
- package/scripts/hook-capture +24 -123
- package/scripts/hook-close +2 -1
- package/scripts/hook-message-display +19 -5
- package/scripts/hook-record +24 -16
- package/scripts/hook-savepoint +27 -3
- package/scripts/hook-session-start +359 -321
- package/scripts/hook-stop +58 -0
- package/scripts/index-projection +74 -0
- package/scripts/insight-append +17 -4
- package/scripts/install.rb +9 -7
- package/scripts/lib/action_graph_shim.rb +279 -0
- package/scripts/lib/active_delivery.rb +105 -0
- package/scripts/lib/agent_models.rb +63 -25
- package/scripts/lib/arm.rb +48 -83
- package/scripts/lib/atomic_write.rb +31 -0
- package/scripts/lib/backup.rb +65 -0
- package/scripts/lib/cli/command.rb +92 -0
- package/scripts/lib/cli/commands/auto.rb +18 -0
- package/scripts/lib/cli/commands/auto_brief.rb +44 -0
- package/scripts/lib/cli/commands/auto_lock.rb +99 -0
- package/scripts/lib/cli/commands/auto_report.rb +50 -0
- package/scripts/lib/cli/commands/auto_take.rb +31 -0
- package/scripts/lib/cli/commands/backup.rb +43 -0
- package/scripts/lib/cli/commands/checkout.rb +25 -0
- package/scripts/lib/cli/commands/continue.rb +66 -0
- package/scripts/lib/cli/commands/doctor.rb +81 -0
- package/scripts/lib/cli/commands/feedback.rb +40 -0
- package/scripts/lib/cli/commands/help.rb +69 -0
- package/scripts/lib/cli/commands/hook.rb +32 -0
- package/scripts/lib/cli/commands/index.rb +23 -0
- package/scripts/lib/cli/commands/install.rb +21 -0
- package/scripts/lib/cli/commands/installer_verb.rb +37 -0
- package/scripts/lib/cli/commands/intent.rb +19 -0
- package/scripts/lib/cli/commands/intent_answer.rb +37 -0
- package/scripts/lib/cli/commands/intent_command.rb +53 -0
- package/scripts/lib/cli/commands/intent_end.rb +62 -0
- package/scripts/lib/cli/commands/intent_new.rb +62 -0
- package/scripts/lib/cli/commands/intent_note.rb +43 -0
- package/scripts/lib/cli/commands/intent_rule.rb +36 -0
- package/scripts/lib/cli/commands/intent_show.rb +32 -0
- package/scripts/lib/cli/commands/intent_spec.rb +44 -0
- package/scripts/lib/cli/commands/intent_step.rb +71 -0
- package/scripts/lib/cli/commands/intent_verify.rb +26 -0
- package/scripts/lib/cli/commands/migrate.rb +16 -0
- package/scripts/lib/cli/commands/migrate_stores.rb +31 -0
- package/scripts/lib/cli/commands/next.rb +54 -0
- package/scripts/lib/cli/commands/project.rb +19 -0
- package/scripts/lib/cli/commands/project_links.rb +42 -0
- package/scripts/lib/cli/commands/project_list.rb +20 -0
- package/scripts/lib/cli/commands/project_new.rb +72 -0
- package/scripts/lib/cli/commands/query.rb +31 -0
- package/scripts/lib/cli/commands/render.rb +33 -0
- package/scripts/lib/cli/commands/roadmap.rb +19 -0
- package/scripts/lib/cli/commands/roadmap_check.rb +54 -0
- package/scripts/lib/cli/commands/roadmap_log.rb +54 -0
- package/scripts/lib/cli/commands/roadmap_migrate.rb +53 -0
- package/scripts/lib/cli/commands/roadmap_next.rb +70 -0
- package/scripts/lib/cli/commands/roadmap_show.rb +45 -0
- package/scripts/lib/cli/commands/rollback.rb +20 -0
- package/scripts/lib/cli/commands/search.rb +60 -0
- package/scripts/lib/cli/commands/session.rb +18 -0
- package/scripts/lib/cli/commands/session_commit.rb +42 -0
- package/scripts/lib/cli/commands/session_handoff.rb +34 -0
- package/scripts/lib/cli/commands/session_summary.rb +35 -0
- package/scripts/lib/cli/commands/status.rb +68 -0
- package/scripts/lib/cli/commands/subcommand_list.rb +36 -0
- package/scripts/lib/cli/commands/sync.rb +46 -0
- package/scripts/lib/cli/commands/uninstall.rb +20 -0
- package/scripts/lib/cli/commands/update.rb +20 -0
- package/scripts/lib/cli/commands/version.rb +53 -0
- package/scripts/lib/cli/frontier.rb +86 -0
- package/scripts/lib/cli/intent_progress.rb +36 -0
- package/scripts/lib/cli/legacy.rb +80 -0
- package/scripts/lib/cli/output.rb +137 -0
- package/scripts/lib/cli/scope.rb +134 -0
- package/scripts/lib/cli/table.rb +65 -0
- package/scripts/lib/cli.rb +94 -0
- package/scripts/lib/codex_adapter.rb +198 -0
- package/scripts/lib/compact_instructions.rb +13 -5
- package/scripts/lib/core_integrity.rb +71 -0
- package/scripts/lib/dashboard_screen.rb +40 -0
- package/scripts/lib/data_boundary.rb +132 -0
- package/scripts/lib/day_summary.rb +30 -16
- package/scripts/lib/doctor_core.rb +114 -38
- package/scripts/lib/doctor_session_ledger.rb +5 -53
- package/scripts/lib/engine_permissions.rb +88 -0
- package/scripts/lib/exec_worktree.rb +24 -21
- package/scripts/lib/feedback_report.rb +1 -1
- package/scripts/lib/graph_edges.rb +137 -0
- package/scripts/lib/graph_file.rb +246 -0
- package/scripts/lib/graph_measure.rb +645 -0
- package/scripts/lib/graph_measure_budget.rb +409 -0
- package/scripts/lib/graph_measure_cohorts.rb +487 -0
- package/scripts/lib/graph_measure_models.rb +413 -0
- package/scripts/lib/graph_measure_report.rb +532 -0
- package/scripts/lib/graph_tree.rb +98 -0
- package/scripts/lib/guarded_append.rb +155 -0
- package/scripts/lib/handoff.rb +40 -13
- package/scripts/lib/harness_adapter.rb +184 -0
- package/scripts/lib/hook_registry.rb +27 -3
- package/scripts/lib/hook_replay.rb +229 -0
- package/scripts/lib/index_entry.rb +62 -0
- package/scripts/lib/index_projection.rb +201 -0
- package/scripts/lib/insights.rb +1 -1
- package/scripts/lib/installer_core.rb +532 -71
- package/scripts/lib/intent_screen.rb +9 -6
- package/scripts/lib/intent_screen_ansi.rb +73 -12
- package/scripts/lib/intent_validator.rb +2 -2
- package/scripts/lib/lock.rb +10 -11
- package/scripts/lib/message_display.rb +377 -173
- package/scripts/lib/meter_watch.rb +185 -0
- package/scripts/lib/node_file.rb +234 -0
- package/scripts/lib/node_ids.rb +99 -0
- package/scripts/lib/node_input.rb +913 -0
- package/scripts/lib/node_input_compatibility.rb +62 -0
- package/scripts/lib/node_ledger.rb +386 -0
- package/scripts/lib/node_progress.rb +153 -0
- package/scripts/lib/node_return.rb +204 -0
- package/scripts/lib/node_worktree.rb +337 -0
- package/scripts/lib/outcome_report.rb +440 -0
- package/scripts/lib/preflight.rb +4 -6
- package/scripts/lib/project_config.rb +46 -0
- package/scripts/lib/project_validator.rb +3 -2
- package/scripts/lib/qmd_sync.rb +8 -7
- package/scripts/lib/ready_set.rb +462 -0
- package/scripts/lib/reference_archive.rb +45 -0
- package/scripts/lib/release_guard.rb +18 -0
- package/scripts/lib/report_screen.rb +1460 -74
- package/scripts/lib/rlm/corpus.rb +13 -0
- package/scripts/lib/rlm/probe.rb +29 -0
- package/scripts/lib/rlm/query.rb +22 -0
- package/scripts/lib/roadmap_graph.rb +210 -0
- package/scripts/lib/roadmap_migration.rb +95 -0
- package/scripts/lib/roadmap_queue.rb +158 -8
- package/scripts/lib/roadmap_render.rb +150 -0
- package/scripts/lib/roadmap_savepoint.rb +64 -14
- package/scripts/lib/runner_absorb.rb +703 -0
- package/scripts/lib/runner_answer.rb +206 -0
- package/scripts/lib/runner_core.rb +194 -0
- package/scripts/lib/runner_dispatch.rb +525 -0
- package/scripts/lib/runner_policy.rb +191 -0
- package/scripts/lib/runner_proposals.rb +275 -0
- package/scripts/lib/runner_rewind.rb +201 -0
- package/scripts/lib/runner_sweep.rb +231 -0
- package/scripts/lib/runner_until_empty.rb +252 -0
- package/scripts/lib/runner_watch.rb +389 -0
- package/scripts/lib/savepoint.rb +141 -19
- package/scripts/lib/scaffold_intent.rb +6 -3
- package/scripts/lib/screen_paint.rb +555 -0
- package/scripts/lib/screens/dashboard.rb +20 -0
- package/scripts/lib/screens/plan.rb +18 -0
- package/scripts/lib/screens/roadmap.rb +15 -0
- package/scripts/lib/search_index.rb +55 -0
- package/scripts/lib/session_close.rb +30 -28
- package/scripts/lib/session_git.rb +25 -18
- package/scripts/lib/session_ledger.rb +48 -4
- package/scripts/lib/session_usage.rb +190 -0
- package/scripts/lib/sqlite.rb +22 -0
- package/scripts/lib/stop_gate.rb +95 -0
- package/scripts/lib/store_discovery.rb +7 -6
- package/scripts/lib/store_layout.rb +54 -0
- package/scripts/lib/store_provisioning.rb +2 -1
- package/scripts/lib/store_sync.rb +85 -0
- package/scripts/lib/stores_move.rb +93 -0
- package/scripts/lib/verify_intent.rb +36 -8
- package/scripts/lib/version_number.rb +48 -0
- package/scripts/lib/work_graph.rb +59 -0
- package/scripts/lib/work_graph_validator.rb +201 -0
- package/scripts/lib/worktree.rb +27 -32
- package/scripts/lib/worktree_sweep.rb +6 -5
- package/scripts/link-suggest +2 -1
- package/scripts/meter-watch +57 -0
- package/scripts/migrate-to-global +1 -1
- package/scripts/new-intent +4 -13
- package/scripts/node-input +92 -0
- package/scripts/node-run +225 -0
- package/scripts/node-transition +291 -0
- package/scripts/outcome-report +74 -0
- package/scripts/plastic-lock +42 -33
- package/scripts/promote-session-item +3 -2
- package/scripts/read-config +53 -9
- package/scripts/ready-set +126 -0
- package/scripts/release-check +123 -0
- package/scripts/report-screen +192 -30
- package/scripts/roadmap-graph +119 -0
- package/scripts/roadmap-savepoint +7 -0
- package/scripts/runner +581 -0
- package/scripts/savepoint-note +11 -9
- package/scripts/session-commit +2 -1
- package/scripts/session-usage +56 -0
- package/scripts/skill-lint +115 -6
- package/scripts/spawn-preamble +2 -2
- package/scripts/update.rb +25 -4
- package/scripts/validate-work-graph +39 -0
- package/scripts/verify-intent +3 -2
- package/scripts/write-handoff +2 -1
- package/templates/agents.md +7 -7
- package/templates/config.yml +16 -9
- package/templates/dashboard-screen.md +22 -0
- package/templates/display-fixture.md +21 -0
- package/templates/graph.md +16 -0
- package/templates/index.md +1 -1
- package/templates/intent-screen.md +1 -1
- package/templates/node-decision.md +11 -0
- package/templates/node-research.md +13 -0
- package/templates/node-verify.md +13 -0
- package/templates/node-work.md +22 -0
- package/templates/outcome.md +15 -2
- package/templates/project.yml +1 -1
- package/templates/render.css +10 -0
- package/templates/report-plan.md +15 -0
- package/templates/report-roadmap-delivered.md +10 -0
- package/templates/report-roadmap-plan.md +9 -0
- package/templates/report-roadmap-state.md +9 -0
- package/templates/report-state.md +1 -1
- package/templates/roadmap.md +13 -0
- package/bin/plastic.js +0 -70
- package/scripts/lib/bridge.rb +0 -116
- package/skills/agent-advisor/SKILL.md +0 -92
- package/skills/auto/SKILL.md +0 -295
- package/skills/auto/evals/evals.json +0 -255
- package/skills/auto/references/end-tail.md +0 -66
- package/skills/auto/references/human-report-contract.md +0 -78
- package/skills/conventions/SKILL.md +0 -29
- package/skills/dashboard/SKILL.md +0 -169
- package/skills/dashboard/evals/evals.json +0 -38
- package/skills/dashboard/references/classification.md +0 -22
- package/skills/dashboard/templates/dashboard-global.md +0 -20
- package/skills/dashboard/templates/dashboard-project.md +0 -19
- package/skills/direct/SKILL.md +0 -66
- package/skills/direct/references/request-signals.md +0 -59
- package/skills/doctor/SKILL.md +0 -299
- package/skills/doctor/report.md +0 -102
- package/skills/feedback/SKILL.md +0 -98
- package/skills/feedback/references/transport-and-privacy.md +0 -65
- package/skills/feedback/report.md +0 -36
- package/skills/install/SKILL.md +0 -217
- package/skills/intent-continuing/SKILL.md +0 -154
- package/skills/intent-continuing/references/board-fill.md +0 -43
- package/skills/intent-continuing/references/boarding-matrix.md +0 -34
- package/skills/intent-continuing/references/context-management.md +0 -28
- package/skills/intent-continuing/references/liveness-ranking.md +0 -57
- package/skills/intent-creating/SKILL.md +0 -164
- package/skills/intent-creating/evals/evals.json +0 -72
- package/skills/intent-creating/references/lifecycle.md +0 -81
- package/skills/intent-creating/references/wikilinks.md +0 -8
- package/skills/intent-ending/SKILL.md +0 -173
- package/skills/intent-ending/evals/evals.json +0 -74
- package/skills/intent-executing/SKILL.md +0 -170
- package/skills/intent-executing/evals/evals.json +0 -66
- package/skills/intent-executing/implementer-prompt.md +0 -42
- package/skills/intent-executing/spec-reviewer-prompt.md +0 -27
- package/skills/intent-speccing/SKILL.md +0 -130
- package/skills/intent-speccing/evals/evals.json +0 -126
- package/skills/intent-speccing/references/design-principles.md +0 -44
- package/skills/intent-speccing/references/per-section-fill-rules.md +0 -92
- package/skills/intent-speccing/references/self-verify-checklist.md +0 -37
- package/skills/project-creating/SKILL.md +0 -162
- package/skills/project-creating/references/hubs-projects.md +0 -55
- package/skills/project-creating/references/project-scaffolding.md +0 -97
- package/skills/releasing/SKILL.md +0 -337
- package/skills/releasing/references/deprecations.md +0 -60
- package/skills/releasing/references/promotion-and-tagging.md +0 -66
- package/skills/releasing/references/release-lines.md +0 -105
- package/skills/roadmap/SKILL.md +0 -64
- package/skills/roadmap/references/file-format.md +0 -124
- package/skills/roadmap/references/operations.md +0 -112
- package/skills/rollback/SKILL.md +0 -91
- package/skills/tutorial/SKILL.md +0 -65
- package/skills/tutorial/evals/evals.json +0 -186
- package/skills/uninstall/SKILL.md +0 -75
- package/skills/update/SKILL.md +0 -126
- /package/{skills/auto/references → docs/help}/agent-report-contract.md +0 -0
- /package/{skills/intent-executing → docs/help}/code-quality-reviewer-prompt.md +0 -0
- /package/{skills/conventions/references → docs/help}/lifecycle-and-savepoints.md +0 -0
- /package/{skills/intent-executing → docs/help}/plan-reviewer-prompt.md +0 -0
package/skills/feedback/SKILL.md
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-feedback
|
|
3
|
-
description: Use when the user hits a Plastic quirk, bug, or feature idea in a project and wants to report it back to the Plastic project. Builds a sanitized report file and a prefilled GitHub issue URL the user reviews and submits. Only the user sends.
|
|
4
|
-
disable-model-invocation: true
|
|
5
|
-
user-invocable: true
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Plastic Feedback
|
|
9
|
-
|
|
10
|
-
Turn a described Plastic problem into a local report file and a prefilled GitHub
|
|
11
|
-
issue URL. The script does the mechanics (redaction, naming, URL building); the
|
|
12
|
-
user alone opens the URL and submits it. This skill has no send step, by design.
|
|
13
|
-
|
|
14
|
-
Because `disable-model-invocation` hides this skill's description from your own
|
|
15
|
-
context, you cannot discover it by browsing available skills mid-task. If the
|
|
16
|
-
user hits a Plastic quirk, bug, or missing feature, offer to run
|
|
17
|
-
`/plastic-feedback` yourself; do not wait for the user to ask for it by name.
|
|
18
|
-
|
|
19
|
-
## Procedure
|
|
20
|
-
|
|
21
|
-
### 1. Gather the narrative
|
|
22
|
-
|
|
23
|
-
Ask the user for:
|
|
24
|
-
- What happened (the observed behavior).
|
|
25
|
-
- The root cause, if they already know it.
|
|
26
|
-
- The expected behavior.
|
|
27
|
-
|
|
28
|
-
Keep it to about one page. Do not pad it with speculation; a short, accurate
|
|
29
|
-
report beats a long, padded one.
|
|
30
|
-
|
|
31
|
-
### 2. Obfuscate before it leaves this session
|
|
32
|
-
|
|
33
|
-
Before filling the template, strip anything that identifies the user's project
|
|
34
|
-
or its content:
|
|
35
|
-
- Remove project names, directory paths, and file names specific to the user's
|
|
36
|
-
codebase.
|
|
37
|
-
- Turn any Plastic intent names into their bare numeric or slug ids (drop the
|
|
38
|
-
descriptive title if it leaks project context).
|
|
39
|
-
- Keep only Plastic's own operational content: what Plastic did, what it should
|
|
40
|
-
have done, which command or hook was involved.
|
|
41
|
-
|
|
42
|
-
Read `references/transport-and-privacy.md` before filling the template, for the
|
|
43
|
-
full obfuscation checklist and the reasoning behind it.
|
|
44
|
-
|
|
45
|
-
### 3. Fill the report template
|
|
46
|
-
|
|
47
|
-
Read `report.md` from this skill's directory (`~/.plastic/skills/feedback/report.md`
|
|
48
|
-
at runtime, or the plugin source `skills/feedback/report.md` during development).
|
|
49
|
-
Fill every placeholder except `{{plastic_version}}`, which the script fills.
|
|
50
|
-
Assemble the final markdown body from the filled template.
|
|
51
|
-
|
|
52
|
-
### 4. Run the script
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
ruby ~/.plastic/scripts/feedback-report --title "<short title>"
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Pipe the filled body on STDIN. Parse the JSON on stdout:
|
|
59
|
-
|
|
60
|
-
| Key | Meaning |
|
|
61
|
-
|---|---|
|
|
62
|
-
| `report_path` | Local file the full, uncapped report was written to |
|
|
63
|
-
| `url` | Prefilled GitHub new-issue URL |
|
|
64
|
-
| `encoded_url_bytes` | Byte length of the encoded URL |
|
|
65
|
-
| `truncated` | Whether the URL body is a capped page-one, not the full report |
|
|
66
|
-
| `page_break_note` | The end-marker text appended when `truncated` is true, else null |
|
|
67
|
-
|
|
68
|
-
The script only ever writes a local file and prints a URL. It has no network
|
|
69
|
-
call, no token, and no way to open a browser or submit anything on its own.
|
|
70
|
-
|
|
71
|
-
### 5. Present the result
|
|
72
|
-
|
|
73
|
-
Show the user:
|
|
74
|
-
- The local file path (`report_path`).
|
|
75
|
-
- A short preview of the report.
|
|
76
|
-
- The URL.
|
|
77
|
-
|
|
78
|
-
If `truncated` is true, tell the user plainly: the URL carries page one of the
|
|
79
|
-
report, and the full report is in the local file at `report_path`. They can
|
|
80
|
-
paste more from the local file into the opened issue if they want.
|
|
81
|
-
|
|
82
|
-
Then tell them, in these words or close to them: open the URL, review it, drag
|
|
83
|
-
a screenshot onto the form if they have one, and submit it under their own
|
|
84
|
-
GitHub account. Or, if they would rather edit first, copy the local file
|
|
85
|
-
contents into a new issue themselves.
|
|
86
|
-
|
|
87
|
-
### 6. Never submit
|
|
88
|
-
|
|
89
|
-
State plainly that this skill has no send step: it never posts to GitHub, never
|
|
90
|
-
runs `gh issue create`, and never opens a browser on the user's behalf. The user
|
|
91
|
-
is the only one who can submit the report.
|
|
92
|
-
|
|
93
|
-
## Gotchas
|
|
94
|
-
|
|
95
|
-
- If the described report is long, the script may hand back `truncated: true`.
|
|
96
|
-
This is expected, not an error: the local file always holds the full text.
|
|
97
|
-
- Do not try to route around the missing send step (no `gh` call, no API POST).
|
|
98
|
-
The absence of a send path is the point of this skill, not a gap to fill.
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# Transport and Privacy
|
|
2
|
-
|
|
3
|
-
Read this before filling `report.md` and before presenting the URL to the user.
|
|
4
|
-
|
|
5
|
-
## Obfuscation checklist (do this before filling the template)
|
|
6
|
-
|
|
7
|
-
Run through this list on the narrative gathered from the user, before it goes
|
|
8
|
-
into `report.md`:
|
|
9
|
-
|
|
10
|
-
- Strip project names. Refer to "the project" or "a consumer project", never
|
|
11
|
-
the user's actual project name.
|
|
12
|
-
- Strip file paths and directory names specific to the user's codebase.
|
|
13
|
-
- Turn Plastic intent names into their bare ids. Drop the descriptive title if
|
|
14
|
-
it names project content (an intent title like "Fix the checkout flow" leaks
|
|
15
|
-
what the user is building; "intent 42" does not).
|
|
16
|
-
- Keep only Plastic's own operational content: which command, hook, or skill
|
|
17
|
-
ran, what it did, what it should have done instead.
|
|
18
|
-
- Before presenting the URL, re-read the filled report once and confirm none
|
|
19
|
-
of the above slipped back in.
|
|
20
|
-
|
|
21
|
-
## Mechanical redaction (what the script also strips)
|
|
22
|
-
|
|
23
|
-
`scripts/lib/feedback_report.rb` redacts these patterns to `[REDACTED]` before
|
|
24
|
-
the report ever touches disk, as a second, mechanical layer under the
|
|
25
|
-
obfuscation above:
|
|
26
|
-
|
|
27
|
-
| Secret kind | Pattern shape |
|
|
28
|
-
|---|---|
|
|
29
|
-
| GitHub tokens | `ghp_`, `gho_`, `ghs_`, `ghr_`, `ghu_`, `github_pat_` prefixes |
|
|
30
|
-
| Anthropic/OpenAI keys | `sk-ant-...`, `sk-...` |
|
|
31
|
-
| AWS access key id | `AKIA...` |
|
|
32
|
-
| Bearer tokens | `Bearer <token>` |
|
|
33
|
-
| Slack tokens | `xoxb-`, `xoxa-`, `xoxp-`, `xoxr-`, `xoxs-` prefixes |
|
|
34
|
-
| Google API keys | `AIza...` |
|
|
35
|
-
| PEM private key blocks | `-----BEGIN ... PRIVATE KEY----- ... -----END ... PRIVATE KEY-----` |
|
|
36
|
-
| Key/value assignments | `api_key = ...`, `secret: ...`, `token = ...`, `password: ...` (value only) |
|
|
37
|
-
|
|
38
|
-
Treat this list as a safety net, not the primary defense. The mechanical
|
|
39
|
-
patterns catch a specific, known shape; the obfuscation pass above is what
|
|
40
|
-
catches project-identifying context a regex cannot recognize.
|
|
41
|
-
|
|
42
|
-
## Why a prefilled URL, and not something else
|
|
43
|
-
|
|
44
|
-
The report is sent by opening a prefilled `https://github.com/zalom/plastic/issues/new`
|
|
45
|
-
URL in the user's own browser. Submission happens in an authenticated session
|
|
46
|
-
that belongs to the user, not to the agent or the script. Nothing in this
|
|
47
|
-
skill or in `feedback-report` can complete that submission on its own: there
|
|
48
|
-
is no send method, no token, and no network call anywhere in the code path.
|
|
49
|
-
|
|
50
|
-
Other transports were considered and rejected:
|
|
51
|
-
|
|
52
|
-
- **`gh issue create`**: the CLI can send on its own; only `--web` is
|
|
53
|
-
browser-submitted, and the plain form cannot be guaranteed not to send
|
|
54
|
-
directly. It also assumes `gh` auth, which a consumer-project user may not
|
|
55
|
-
have.
|
|
56
|
-
- **An API POST with a token**: the agent could send it, and the token itself
|
|
57
|
-
becomes a credential worth stealing.
|
|
58
|
-
- **An anonymous POST endpoint**: still agent-reachable, with no built-in spam
|
|
59
|
-
resistance, and it needs server infrastructure this project does not run.
|
|
60
|
-
- **Email or `git send-email`**: the CLI sends the message, review is opt-in
|
|
61
|
-
rather than forced, and it needs a working mail transport most machines do
|
|
62
|
-
not have configured.
|
|
63
|
-
|
|
64
|
-
Only the prefilled-URL approach makes "the agent cannot send" a structural
|
|
65
|
-
fact instead of a rule the agent could break by taking a shortcut.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Plastic feedback: {{title}}
|
|
2
|
-
|
|
3
|
-
<!-- =======================================================================
|
|
4
|
-
AGENT INSTRUCTIONS -- How to fill this template
|
|
5
|
-
=========================================================================
|
|
6
|
-
1. Replace every {{placeholder}} below with real content gathered from the
|
|
7
|
-
user, except {{plastic_version}}: leave that token exactly as written,
|
|
8
|
-
the feedback-report script fills it from the installed VERSION file.
|
|
9
|
-
2. Obfuscate first (see references/transport-and-privacy.md): strip project
|
|
10
|
-
names, file paths, and anything else that identifies the user's
|
|
11
|
-
codebase. Keep only Plastic's own operational content.
|
|
12
|
-
3. Keep the report to about one page. Use tables or short lists where they
|
|
13
|
-
make the report clearer than prose.
|
|
14
|
-
4. Delete this entire HTML comment block before piping the body into
|
|
15
|
-
feedback-report. It is fill instructions only, not report content.
|
|
16
|
-
======================================================================= -->
|
|
17
|
-
|
|
18
|
-
## Environment
|
|
19
|
-
|
|
20
|
-
| Field | Value |
|
|
21
|
-
|---|---|
|
|
22
|
-
| Plastic version | {{plastic_version}} |
|
|
23
|
-
| Agent | {{agent_name}} |
|
|
24
|
-
| OS | {{os}} |
|
|
25
|
-
|
|
26
|
-
## What happened
|
|
27
|
-
|
|
28
|
-
{{what_happened}}
|
|
29
|
-
|
|
30
|
-
## Root cause (if known)
|
|
31
|
-
|
|
32
|
-
{{root_cause_or_not_known}}
|
|
33
|
-
|
|
34
|
-
## Expected behavior
|
|
35
|
-
|
|
36
|
-
{{expected_behavior}}
|
package/skills/install/SKILL.md
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-install
|
|
3
|
-
description: 'Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. The package pin selects the channel (@latest, @beta, @alpha; the channel flags were removed in 2.0). First install defaults to @latest (stable); reinstalls match the already-installed channel. Global install is recommended: it creates the global intent store as a git-backed repository. Local install creates .plastic/ in the current project for testing.'
|
|
4
|
-
user-invocable: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Install Plastic
|
|
8
|
-
|
|
9
|
-
> **Recommended path:** for a first install, run `npx -y @zalom/plastic@latest install --claude`
|
|
10
|
-
> in your shell (or `bunx -y @zalom/plastic@latest install --claude` if you use Bun). This skill
|
|
11
|
-
> exists to **re-install or repair** an existing setup from inside the agent, and to
|
|
12
|
-
> drive interactive global configuration. Whenever this skill performs an install or
|
|
13
|
-
> re-install, it **runs `/plastic-doctor` afterward** and reports the result.
|
|
14
|
-
|
|
15
|
-
## Channel rule
|
|
16
|
-
|
|
17
|
-
If Plastic is installed, derive `<channel>` from `~/.plastic/VERSION`: a version containing
|
|
18
|
-
`-alpha` means `@alpha`, `-beta` means `@beta`, otherwise `@latest`. If not installed
|
|
19
|
-
(first install), default to `@latest`. To change channel, pin the package instead of
|
|
20
|
-
passing a flag: `npx -y @zalom/plastic@alpha install --claude` (or a version such as
|
|
21
|
-
`@2.0.0-alpha.1`); the `--alpha`, `--beta`, and `--latest` flags were removed in 2.0
|
|
22
|
-
(intent 310) because they never selected a package.
|
|
23
|
-
|
|
24
|
-
## Re-install / repair
|
|
25
|
-
|
|
26
|
-
If Plastic is already installed but something is broken (skills missing, hooks not
|
|
27
|
-
firing, leftover legacy plugin), re-run the installer, it is idempotent, prunes
|
|
28
|
-
files that no longer ship, and removes any legacy plugin/marketplace layout:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
npx -y @zalom/plastic@<channel> install --reinstall --claude
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Then **run `/plastic-doctor`** and report what it found.
|
|
35
|
-
|
|
36
|
-
## Channels
|
|
37
|
-
|
|
38
|
-
| Package | Channel |
|
|
39
|
-
|---------|---------|
|
|
40
|
-
| `@zalom/plastic@latest` | stable (default on a first install) |
|
|
41
|
-
| `@zalom/plastic@beta` | beta |
|
|
42
|
-
| `@zalom/plastic@alpha` | alpha; `npx -y @zalom/plastic@alpha install --claude` is the 2.0 alpha path |
|
|
43
|
-
|
|
44
|
-
When invoked from within Claude Code (re-install or channel switch), the skill
|
|
45
|
-
runs the appropriate npx command:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# Stable (default on a first install)
|
|
49
|
-
npx -y @zalom/plastic@latest install --claude
|
|
50
|
-
|
|
51
|
-
# Beta
|
|
52
|
-
npx -y @zalom/plastic@beta install --claude
|
|
53
|
-
|
|
54
|
-
# Alpha
|
|
55
|
-
npx -y @zalom/plastic@alpha install --claude
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
The installed version and channel are recorded in `~/.plastic/VERSION`.
|
|
59
|
-
|
|
60
|
-
## Modes
|
|
61
|
-
|
|
62
|
-
### Global Install (default, recommended)
|
|
63
|
-
|
|
64
|
-
Run `/plastic-install` with no arguments.
|
|
65
|
-
|
|
66
|
-
#### Procedure
|
|
67
|
-
|
|
68
|
-
**Step 1: Run the installer**
|
|
69
|
-
|
|
70
|
-
Check if `~/.plastic/VERSION` exists.
|
|
71
|
-
- If yes: announce "Plastic is already installed at ~/.plastic/. Run `/plastic-update` to
|
|
72
|
-
sync core files, or use the re-install command above to repair in place."
|
|
73
|
-
- If no: first ask the advisor question below (Claude Code only), then run the fresh
|
|
74
|
-
install command (default `@latest`, or the channel the user named) with whichever
|
|
75
|
-
flags that answer produced:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
npx -y @zalom/plastic@latest install --claude [--no-advisor] [--advisor VALUE]
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
This single command, via `install.rb` (`bootstrap` + `distribute`), creates `store/`,
|
|
82
|
-
`projects/`, `config.yml`, `projects.yml`, `INDEX.md`, and `AGENTS.md` under `~/.plastic/`,
|
|
83
|
-
and copies the utility scripts (`folgezettel-id`, `read-config`, and the rest of
|
|
84
|
-
`scripts/`). This skill does none of that itself; it wraps the command with the
|
|
85
|
-
interactive steps the CLI does not yet own, plus reporting and a doctor pass.
|
|
86
|
-
|
|
87
|
-
**The advisor (Claude Code only)**
|
|
88
|
-
|
|
89
|
-
Ask the user one feature question, interactive sessions only:
|
|
90
|
-
> "Would you like an advisor agent for expensive reasoning: plan review, architecture
|
|
91
|
-
> calls, second opinions, breaking deadlocks?"
|
|
92
|
-
> - Yes (recommended) -> ask which advisor is the default, below
|
|
93
|
-
> - No -> append `--no-advisor`
|
|
94
|
-
|
|
95
|
-
If yes, ask which advisor is the default, exactly two choices:
|
|
96
|
-
> "Which advisor should be the default?"
|
|
97
|
-
> - **Faux Fable** (recommended): Opus 4.8 carrying the frontier reasoning
|
|
98
|
-
> instructions. Much cheaper, available on any plan, reasons in the same
|
|
99
|
-
> disciplined way. -> append `--advisor faux`
|
|
100
|
-
> - **Fable 5**: the frontier model itself. The strongest reasoning available,
|
|
101
|
-
> billed through usage credits, so summon it for a few rounds and close it. ->
|
|
102
|
-
> append `--advisor real`
|
|
103
|
-
|
|
104
|
-
Non-interactive sessions (no tty) skip the question entirely: the install ships with the
|
|
105
|
-
shipped default, advisor enabled with no `--advisor` flag (the `plastic-agent-advisor`
|
|
106
|
-
skill's own routing falls back to `plastic-faux-advisor` at consult time).
|
|
107
|
-
|
|
108
|
-
Update flow: pending config questions, including this one, are now announced
|
|
109
|
-
generically by `plastic-update`'s Step 2, sourced from `config_asks.yml` - not
|
|
110
|
-
duplicated here. A value already set by either path is never re-asked by the
|
|
111
|
-
other.
|
|
112
|
-
|
|
113
|
-
**Statusline**
|
|
114
|
-
|
|
115
|
-
On install, if an existing statusline is already configured, Plastic asks whether to
|
|
116
|
-
keep it or switch to Plastic's (interactive sessions only). The choice is honored via
|
|
117
|
-
`--statusline keep` or `--statusline plastic`, which skips the prompt. Non-interactive
|
|
118
|
-
sessions (no tty) default to keeping the user's line: nothing is silently overwritten.
|
|
119
|
-
A fresh system with no statusline configured gets Plastic's line with no prompt.
|
|
120
|
-
|
|
121
|
-
**Step 2: Initialize git (retained)**
|
|
122
|
-
|
|
123
|
-
Only if `~/.plastic/.git` is absent (a fresh bootstrap does not init git):
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
cd ~/.plastic && git init && git add . && git commit -m "chore: initialize Plastic global intent store"
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Retained here because the CLI does not git-init the store yet (follow-up).
|
|
130
|
-
|
|
131
|
-
**Step 3: Personalize config (retained)**
|
|
132
|
-
|
|
133
|
-
Detect which agent is running:
|
|
134
|
-
- If `CLAUDE_CODE` env var is set or we're running inside Claude Code -> `agent.type: claude-code`
|
|
135
|
-
- If `HERMES_HOME` env var is set -> `agent.type: hermes`
|
|
136
|
-
- Otherwise -> ask the user: "Which AI agent are you using? (claude-code / hermes / other)"
|
|
137
|
-
|
|
138
|
-
Ask the user:
|
|
139
|
-
> "Enable Agent Teams? (experimental: parallel project work with teammates)"
|
|
140
|
-
> - Yes -> set `parallel_mode: agent-teams`
|
|
141
|
-
> - No -> set `parallel_mode: linear` (subagents only)
|
|
142
|
-
|
|
143
|
-
Inform the user:
|
|
144
|
-
> "Plastic agents can create GitHub repositories for new projects. By default, all
|
|
145
|
-
> agent-created repos are **private**. Your global intent store (~/.plastic/) is never
|
|
146
|
-
> pushed, it stays local-only."
|
|
147
|
-
|
|
148
|
-
Ask the user:
|
|
149
|
-
> "Default visibility for agent-created repos?"
|
|
150
|
-
> - Private (recommended) -> set `github.default_visibility: private`
|
|
151
|
-
> - Public -> set `github.default_visibility: public`
|
|
152
|
-
>
|
|
153
|
-
> "Allow agents to push to GitHub without asking?"
|
|
154
|
-
> - No (recommended) -> set `github.auto_push: false`
|
|
155
|
-
> - Yes -> set `github.auto_push: true`
|
|
156
|
-
>
|
|
157
|
-
> "Where do you keep your projects? Default: ~/.plastic/projects/"
|
|
158
|
-
> "Add additional roots? (e.g., ~/apps/personal/, ~/apps/companies/)"
|
|
159
|
-
|
|
160
|
-
Write each answer via `read-config --migrate` first (ensures the v3 schema), then the
|
|
161
|
-
chosen values; auto-commit each change. Retained here because the CLI writes only
|
|
162
|
-
hardcoded defaults, so these interactive choices stay in the skill.
|
|
163
|
-
|
|
164
|
-
**Step 4: Verify with doctor**
|
|
165
|
-
|
|
166
|
-
Run `/plastic-doctor` and report the result. Resolve any fixable findings before
|
|
167
|
-
announcing success.
|
|
168
|
-
|
|
169
|
-
**Step 5: Register stores with QMD (retained)**
|
|
170
|
-
|
|
171
|
-
QMD is an optional search layer. If it is installed, register the Plastic stores so
|
|
172
|
-
they are searchable:
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
ruby ~/.plastic/scripts/qmd-sync detect && ruby ~/.plastic/scripts/qmd-sync register --all
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
`qmd-sync` no-ops cleanly when QMD is absent, so this is safe to run unconditionally.
|
|
179
|
-
It registers `plastic-global` and every project store from `projects.yml`, then indexes
|
|
180
|
-
them. Report what was registered, or that QMD was not detected and the step was skipped.
|
|
181
|
-
Retained here because the CLI does not register at install time (follow-up).
|
|
182
|
-
|
|
183
|
-
**Step 6: Report + announce**
|
|
184
|
-
|
|
185
|
-
```
|
|
186
|
-
Plastic install (<channel>)
|
|
187
|
-
Command: npx -y @zalom/plastic@<channel> install --claude <flags>
|
|
188
|
-
Version: none -> <installed>
|
|
189
|
-
Doctor: <summary or "all clear">
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
Then: "Read [`your-first-intent-in-10-minutes.md`](https://github.com/zalom/plastic/blob/main/docs/guides/your-first-intent-in-10-minutes.md) for your first intent, start to finish."
|
|
193
|
-
|
|
194
|
-
### Local Install (testing/legacy)
|
|
195
|
-
|
|
196
|
-
Run `/plastic-install --local`. `install.rb` has no `--local` verb, so this mode is
|
|
197
|
-
genuinely skill-owned.
|
|
198
|
-
|
|
199
|
-
#### Procedure
|
|
200
|
-
|
|
201
|
-
**Step 1:** Check if `.plastic/` exists in CWD, if so, warn and exit.
|
|
202
|
-
|
|
203
|
-
**Step 2:** Create `.plastic/` in CWD:
|
|
204
|
-
- `config.yml` from templates
|
|
205
|
-
- `INDEX.md` from templates
|
|
206
|
-
- `store/` with `.gitkeep`
|
|
207
|
-
|
|
208
|
-
**Step 3:** If global install exists (`~/.plastic/projects.yml`), register this project:
|
|
209
|
-
- Determine project slug from directory name
|
|
210
|
-
- Detect git remote URL if available
|
|
211
|
-
- Add entry to `~/.plastic/projects.yml` with `parent: null`
|
|
212
|
-
- Auto-commit in `~/.plastic/`
|
|
213
|
-
|
|
214
|
-
**Step 4:** Commit in project: `git add .plastic/ && git commit -m "chore: initialize Plastic local store"`
|
|
215
|
-
|
|
216
|
-
**Step 5:** Announce: "Plastic initialized locally. This is a testing/legacy mode. Consider
|
|
217
|
-
`/plastic-install` for global mode."
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-intent-continuing
|
|
3
|
-
description: >-
|
|
4
|
-
The front door for resuming work. Use when the user says "continue", "resume", "pick up
|
|
5
|
-
where we left off", "where was I", "what should I work on", names a specific intent to
|
|
6
|
-
resume (by id or description, or `--intent {id}`), or names a roadmap or delivery batch to
|
|
7
|
-
resume (`--roadmap {slug}`, "where is the roadmap", "where did that batch land"). Presents
|
|
8
|
-
state and resumes at the last delivered stage; it never asks auto or guided, never boots
|
|
9
|
-
(the SessionStart hook owns boot), and never drives work autonomously (plastic-auto does).
|
|
10
|
-
Absorbs the former continuing, project-continuing, and roadmap-continuing skills and the
|
|
11
|
-
read half of the former intent-starting skill (intent 304).
|
|
12
|
-
user-invocable: true
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# Continuing: the front door for resuming work
|
|
16
|
-
|
|
17
|
-
One skill with three routes. It reads state and presents it; the work itself continues in
|
|
18
|
-
whatever mode the session is in (direct by default, `plastic-auto` when the owner says auto).
|
|
19
|
-
There is no lock to take and no mode to ask here: locks exist only for auto teams, and the
|
|
20
|
-
mode is the owner's word, not a question this skill puts.
|
|
21
|
-
|
|
22
|
-
**Boot is not this skill's job.** `hook-session-start` runs on every session start: the core
|
|
23
|
-
health check (`doctor --core`), `PLASTIC.md` and store or project state, the
|
|
24
|
-
`Plastic Core loaded - v{version}` banner. By the time this skill runs, core is loaded and
|
|
25
|
-
healthy or the banner already warned.
|
|
26
|
-
|
|
27
|
-
## Route
|
|
28
|
-
|
|
29
|
-
| Args or context | Route |
|
|
30
|
-
|---|---|
|
|
31
|
-
| `--intent {id}`, or the user names one specific intent to resume (by id or description) | Intent route (below) |
|
|
32
|
-
| `--roadmap {slug}`, or the user asks to continue or resume a roadmap or delivery batch | Roadmap route (below) |
|
|
33
|
-
| bare "continue", "resume", "what should I work on", or no target (the default) | Project route (below) |
|
|
34
|
-
|
|
35
|
-
State the chosen route in one line before doing anything ("Landing on the project board: no
|
|
36
|
-
specific intent or roadmap named.").
|
|
37
|
-
|
|
38
|
-
## Determine store
|
|
39
|
-
|
|
40
|
-
1. A project store under `~/.plastic/projects/{slug}/` whose registered path in
|
|
41
|
-
`~/.plastic/projects.yml` matches the working directory means project mode; the
|
|
42
|
-
SessionStart hook already detected this, the slug scopes the reads below.
|
|
43
|
-
2. Otherwise the global store, `~/.plastic/store/`.
|
|
44
|
-
3. Neither exists: announce "No Plastic store found. Run /plastic-install." and stop.
|
|
45
|
-
|
|
46
|
-
## Project route: land on the board
|
|
47
|
-
|
|
48
|
-
Land on the Markdown board through the `plastic-dashboard` skill; rendering belongs there.
|
|
49
|
-
Run the data payload and fill the matching template:
|
|
50
|
-
- project loaded: `ruby ~/.plastic/scripts/dashboard.rb project <slug> --data`
|
|
51
|
-
- otherwise (the global fallback): `ruby ~/.plastic/scripts/dashboard.rb continue --data`
|
|
52
|
-
|
|
53
|
-
Fill the template from `plastic-dashboard`'s `templates/` and present the filled Markdown in
|
|
54
|
-
your reply, every time: tool-call stdout and hook context are invisible to the user. Read
|
|
55
|
-
`references/board-fill.md` for the fill mechanics and the store-health line when filling the
|
|
56
|
-
board. The board load runs the scoped store check (`doctor --store <scope>`); its result
|
|
57
|
-
arrives in the payload as `store_health` and is shown as one line of data, never a blocker.
|
|
58
|
-
|
|
59
|
-
Priority order on the board: active intents first, then project context (governing plus
|
|
60
|
-
tactical intents in a registered project), then stale future intents for triage, then fresh
|
|
61
|
-
future intents as next work. A future intent older than `stale_threshold_days` (default 3) is
|
|
62
|
-
surfaced for triage without action: activate, abandon, or leave. Activating moves it to
|
|
63
|
-
`## Active` in `INDEX.md` and auto-commits. The board's ranked next-work order is computed by
|
|
64
|
-
`dashboard.rb`; cite the rule names only (Effort, Value, Flags, Override, Caps) and read
|
|
65
|
-
`plastic-dashboard`'s `references/classification.md` for their definitions.
|
|
66
|
-
|
|
67
|
-
When the tier root (the directory holding `INDEX.md`) has a mid-flight roadmap
|
|
68
|
-
(`ruby ~/.plastic/scripts/roadmap-next --roadmaps-dir <root>/roadmaps` reports a `state`
|
|
69
|
-
other than `none`), say so in one line and offer the roadmap route; the board still presents
|
|
70
|
-
project state and stops.
|
|
71
|
-
|
|
72
|
-
Then stop: "here is the state, what next?". Do not start executing work. When the user names
|
|
73
|
-
an intent, take the intent route.
|
|
74
|
-
|
|
75
|
-
## Intent route: resume one intent from its ledger
|
|
76
|
-
|
|
77
|
-
QMD-first when the intent is named by description: run
|
|
78
|
-
`ruby ~/.plastic/scripts/qmd-sync search "<terms>"` to find the candidate, then open the
|
|
79
|
-
authoritative intent file. The command is a no-op when QMD is absent; fall back to
|
|
80
|
-
`INDEX.md`.
|
|
81
|
-
|
|
82
|
-
If the intent is terminal (`## Completed` or `## Abandoned` in `INDEX.md`): print the
|
|
83
|
-
intent screen (Status shows the terminal section, Next is empty), summarize its
|
|
84
|
-
`outcome.md`, and ask what is next; never reopen it.
|
|
85
|
-
|
|
86
|
-
For a live intent's directory:
|
|
87
|
-
|
|
88
|
-
1. **Read `savepoint.md` first.** It is a deterministic, append-only ledger, one line per
|
|
89
|
-
event, newest at the bottom: `{utc-iso8601} {Stage} {milestone}`. Classify the stage
|
|
90
|
-
from the last line alone (the table in `references/boarding-matrix.md`, read when
|
|
91
|
-
classifying), then verify only that line's artifact is real (sentinel-aware:
|
|
92
|
-
`Savepoint.stage_file_present?`). Do not re-probe every lifecycle file.
|
|
93
|
-
2. **Stale ledger.** When the last line disagrees with the files on disk, rebuild the ledger from
|
|
94
|
-
disk and note the correction. A rebuilt ledger is the file-landing skeleton, which still
|
|
95
|
-
pins the stage:
|
|
96
|
-
```bash
|
|
97
|
-
ruby -r ~/.plastic/scripts/lib/savepoint -e 'Savepoint.rebuild_savepoint("<intent_dir>")'
|
|
98
|
-
```
|
|
99
|
-
3. **Read the hand-off.** The newest `~/.plastic/store/.sessions/<day>/handoff--*.md` (today,
|
|
100
|
-
else the newest prior day) is the prior session's own account of where things stand; read
|
|
101
|
-
it after the ledger, never instead of it.
|
|
102
|
-
4. **Derive the next step:** the first unchecked item in `checklist.md` when it exists, else
|
|
103
|
-
the next thing the stage needs (see the matrix). The newest `## Insights` entry supplies
|
|
104
|
-
the human-readable context; an entry marked `(autonomous)` means an auto team was
|
|
105
|
-
delivering it, so say so and offer to hand back to `plastic-auto`.
|
|
106
|
-
5. **Print the report screen as the first thing in the reply, then continue at that stage.**
|
|
107
|
-
The screen must open the message with nothing before it. On Claude Code, a fail-open
|
|
108
|
-
`MessageDisplay` hook recognizes a reply that opens this way and substitutes a styled ANSI
|
|
109
|
-
rendering for it there; the transcript and every other harness keep exactly this plain
|
|
110
|
-
form. For "where are we" on one named intent, run
|
|
111
|
-
`ruby ~/.plastic/scripts/report-screen state <intent_dir>` and print its output as it is:
|
|
112
|
-
the title, the field table, the `Changed` row, and the Steps table come from the record,
|
|
113
|
-
never by eye. For "where are we" with no intent named, run
|
|
114
|
-
`ruby ~/.plastic/scripts/report-screen state --all <store_root>` for the roster across every
|
|
115
|
-
in-delivery intent. Route "why did X take so long" to
|
|
116
|
-
`ruby ~/.plastic/scripts/report-screen delay <intent_dir>` instead - every verb prints the
|
|
117
|
-
same plain screen on any harness, painted only where the harness supports it, with no
|
|
118
|
-
branching on harness name. Under the `state` screen
|
|
119
|
-
write **What this means** as two to four bullets in plain words (what the intent is for,
|
|
120
|
-
what has landed, what is left, any defect named by step), then close with **needs input:**
|
|
121
|
-
naming the first open step. Then continue the work in the
|
|
122
|
-
session's current mode. In auto mode the running team already holds the delivery lock; if a
|
|
123
|
-
lock is held by a session that is gone, the `plastic-doctor` skill's lock section repairs or
|
|
124
|
-
reclaims it.
|
|
125
|
-
|
|
126
|
-
## Roadmap route: resume the mid-flight roadmap
|
|
127
|
-
|
|
128
|
-
1. Resolve the tier root (project or global) and run the shared reader in which mode:
|
|
129
|
-
```bash
|
|
130
|
-
ruby ~/.plastic/scripts/roadmap-next --roadmaps-dir <root>/roadmaps --which
|
|
131
|
-
```
|
|
132
|
-
Read `state` and the winning `roadmap`. A `tie` lists `tie_candidates` to present side by
|
|
133
|
-
side and let the user pick; never pick silently. The reader ranks liveness the way
|
|
134
|
-
`references/liveness-ranking.md` describes (read it when a ranking needs explaining): a
|
|
135
|
-
`delivering` or `blocked` entry wins, else the newest ledger or `## Log` timestamp.
|
|
136
|
-
`roadmaps/<slug>.savepoint.md` is a derived signal read here, never a status field;
|
|
137
|
-
`INDEX.md` stays the sole status writer.
|
|
138
|
-
2. **Present state:** the roadmap's `## Goal`, the current batch with each entry's mirrored
|
|
139
|
-
status, the ledger's newest line beside the newest `## Log` line. Read
|
|
140
|
-
`../plastic-conventions/references/roadmaps.md` for the file format and the status-mirror
|
|
141
|
-
rule when a roadmap file needs interpreting.
|
|
142
|
-
3. Then continue with the next dispatchable entry in the session's mode: direct work on it,
|
|
143
|
-
or `plastic-auto` when the owner says auto. The coordinator that drives a batch appends
|
|
144
|
-
to `roadmaps/<slug>.savepoint.md` at its dispatch, merge, park, and handoff points with
|
|
145
|
-
`ruby ~/.plastic/scripts/roadmap-savepoint append`; this skill only reads it.
|
|
146
|
-
|
|
147
|
-
## References
|
|
148
|
-
|
|
149
|
-
| Trigger | Read |
|
|
150
|
-
|---|---|
|
|
151
|
-
| Filling the board on the project route | `references/board-fill.md` |
|
|
152
|
-
| Classifying the stage from the ledger's last line | `references/boarding-matrix.md` |
|
|
153
|
-
| Explaining why one roadmap ranked above another | `references/liveness-ranking.md` |
|
|
154
|
-
| Saving or restoring context across a long session, or debugging a resume | `references/context-management.md` |
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# Board Fill Mechanics
|
|
2
|
-
|
|
3
|
-
Depth reference for the "Continue (present the board)" section of `SKILL.md`. The fill itself
|
|
4
|
-
is mechanical; `plastic-dashboard` owns the rules, this page is a pointer plus the detail that
|
|
5
|
-
would otherwise bloat the SKILL.md body.
|
|
6
|
-
|
|
7
|
-
## Fill rules (owned by plastic-dashboard, summarized here for convenience)
|
|
8
|
-
|
|
9
|
-
- `{{a.b.count}}` -> the integer (e.g. `counts.active` is that count).
|
|
10
|
-
- `{{<list>.rows}}` -> the two intent lists (`active`, `next_work`) render as Markdown table
|
|
11
|
-
rows. The template hard-codes each table's header and separator; the placeholder becomes one
|
|
12
|
-
data row per entry, in that table's fixed column order, cells dropped verbatim from the
|
|
13
|
-
payload (cells arrive pipe-escaped and whitespace-normalized; do not re-escape or
|
|
14
|
-
re-truncate). Column order per table:
|
|
15
|
-
- `next_work` -> `| id | what | value | disposition | flags_label |`
|
|
16
|
-
- `active` -> `| id | what | stage |`
|
|
17
|
-
Empty list -> one full-width row with `_(none)_` in the Id column, other cells blank, matching
|
|
18
|
-
that table's column count. Neither list carries an overflow "+N more" row (intent 202): the
|
|
19
|
-
true pool size rides on the payload (`active_total`/`next_total`, shown as
|
|
20
|
-
`active_shown`/`next_shown`), stated in prose by `{{footer}}` instead. Never emit `<br>`.
|
|
21
|
-
- `{{projects.lines}}` (global board) -> the project rollup stays prose, one line per project.
|
|
22
|
-
- Scalars (`{{date}}`, `{{slug}}`, `{{summary}}`, `{{footer}}`) -> substitute verbatim.
|
|
23
|
-
`summary` (the 2-3 sentence "what was delivered most recently") and `footer` (the
|
|
24
|
-
honest-totals + how-to-see-everything line) are finished prose built in `dashboard.rb`,
|
|
25
|
-
replacing the old recently-worked table and the raw future table respectively.
|
|
26
|
-
|
|
27
|
-
No re-sorting, no re-summarizing, no hand-written prose replacing a line the payload already
|
|
28
|
-
supplies. Same store state produces a byte-identical payload regardless of model.
|
|
29
|
-
|
|
30
|
-
## Store-health surfacing
|
|
31
|
-
|
|
32
|
-
Every board load runs the scoped `doctor --store <scope>` check server-side (inside
|
|
33
|
-
`dashboard.rb`, not this skill). The payload carries the result as `store_health` (`{scope,
|
|
34
|
-
status, summary, failing_checks}`). Render it as a single line, for example `store health:
|
|
35
|
-
pass (3/3)` or `store health: warn (orphaned_intents)`. A warn or fail is informational only;
|
|
36
|
-
it never blocks presenting the board.
|
|
37
|
-
|
|
38
|
-
## Project vs. global fallback
|
|
39
|
-
|
|
40
|
-
The project route's default target is the project board. When no project is loaded (the rare
|
|
41
|
-
case where this route is reached without a registered project in scope), fall back to the
|
|
42
|
-
global board payload (`dashboard.rb continue --data`) rather than failing. This mirrors the
|
|
43
|
-
router's D6 default: a bare "continue" always lands somewhere useful.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Boarding matrix: which stage a resume lands at
|
|
2
|
-
|
|
3
|
-
The stage is derived from `savepoint.md`'s last line plus the real artifacts on disk.
|
|
4
|
-
Classify from the last line alone, then verify only that line's artifact is real
|
|
5
|
-
(sentinel-aware). When the ledger is stale, rebuild it from disk and note it.
|
|
6
|
-
|
|
7
|
-
| savepoint last line | latest delivered | lands at | continue with |
|
|
8
|
-
|---|---|---|---|
|
|
9
|
-
| `What {id}--{slug}.md` (born) | What | **Why** | the thinking conversation (`plastic-intent-speccing`) or direct work |
|
|
10
|
-
| `Why started` (spec still sentinel) | What | **Why** | continue the conversation; rulings land as insights |
|
|
11
|
-
| `Why spec.md created` | Why | **How** | the action files, `plan.md`, `checklist.md` |
|
|
12
|
-
| `How started` / `How plan.md created` | (How in progress) | **How** | finish `plan.md` and `checklist.md` |
|
|
13
|
-
| `How checklist.md created` / `Exec started` | How | **Exec** | do the work, check off the checklist |
|
|
14
|
-
| `Exec outcome.md created` | Exec | **ready to complete** | the ending procedure (`plastic-intent-ending`) |
|
|
15
|
-
| `Done delivered` / `Done abandoned` | terminal | **report only** | immutable; ask what is next |
|
|
16
|
-
|
|
17
|
-
## Per-stage behaviour (what "continue" means)
|
|
18
|
-
|
|
19
|
-
- **Why**: continue the conversation, or run the work directly when the request is already
|
|
20
|
-
clear; every ruling is recorded as it lands.
|
|
21
|
-
- **How**: write or finish the action files, `plan.md`, and `checklist.md`.
|
|
22
|
-
- **Exec**: verify what is delivered, then continue (or restart) the delivery or research.
|
|
23
|
-
The first unchecked `checklist.md` item is the next step; the newest `## Insights` entry
|
|
24
|
-
supplies the context.
|
|
25
|
-
- **ready to complete**: `outcome.md` is real; run the ending procedure.
|
|
26
|
-
- **Done**: terminal. Report the outcome, ask what is next. Never reopen; `INDEX.md` is
|
|
27
|
-
authoritative.
|
|
28
|
-
|
|
29
|
-
## Notes
|
|
30
|
-
|
|
31
|
-
- A Plastic 1.x ledger may carry a `Tier <letter>` line under the `Why spec.md created` line
|
|
32
|
-
(the intent tier was removed in 2.0, intent 304). It is inert: skip it when classifying.
|
|
33
|
-
- An `## Insights` entry marked `(autonomous)` means an auto team was delivering the intent;
|
|
34
|
-
say so and offer to hand back to `plastic-auto`.
|