@zalom/plastic 2.0.0-alpha.9 → 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 +11 -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 +55 -2
- 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 +153 -30
- 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 +7 -0
- 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 +23 -14
- 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 +531 -71
- package/scripts/lib/intent_screen.rb +4 -4
- 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 +350 -54
- 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 +1371 -47
- 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 +365 -28
- 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 +177 -16
- 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 +8 -3
- 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 -296
- 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 -176
- 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
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-releasing
|
|
3
|
-
description: Use when merging a feature branch to main and tagging a release, bumping the version, or when the user says "release", "tag", or "ship it"
|
|
4
|
-
user-invocable: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Releasing
|
|
8
|
-
|
|
9
|
-
Merge, bump, tag, push. Annotated tags with changelogs. Semantic versioning.
|
|
10
|
-
Project configuration drives the workflow - no hardcoded assumptions.
|
|
11
|
-
|
|
12
|
-
## Checklist
|
|
13
|
-
|
|
14
|
-
- [ ] Read project config
|
|
15
|
-
- [ ] All tests pass (or verification skipped per config)
|
|
16
|
-
- [ ] Merge feature branch to main
|
|
17
|
-
- [ ] Bump version in configured version files
|
|
18
|
-
- [ ] Stable-cut guard passes (version files agree, no pre-release suffix; stable/latest cuts only)
|
|
19
|
-
- [ ] Commit version bump
|
|
20
|
-
- [ ] Create annotated tag
|
|
21
|
-
- [ ] Push to remote with tags
|
|
22
|
-
- [ ] Run post-push actions (GitHub release, npm publish, etc.)
|
|
23
|
-
- [ ] Verify release sync (npm dist-tag, GitHub "Latest", git tag all show the new version)
|
|
24
|
-
- [ ] Clean up the intent's worktrees (merge-then-remove)
|
|
25
|
-
- [ ] Complete active intent
|
|
26
|
-
|
|
27
|
-
## Workflow
|
|
28
|
-
|
|
29
|
-
### 0. Read Project Config
|
|
30
|
-
|
|
31
|
-
Before anything else, determine which project we are releasing and load its config.
|
|
32
|
-
|
|
33
|
-
1. Read `~/.plastic/projects.yml` - find the project whose `path` matches the current working directory.
|
|
34
|
-
2. Extract the project slug (the key under `projects:`).
|
|
35
|
-
3. Read `~/.plastic/projects/{slug}/project.yml` - this contains the `release:` section.
|
|
36
|
-
|
|
37
|
-
Expected `release:` keys in project.yml:
|
|
38
|
-
|
|
39
|
-
```yaml
|
|
40
|
-
release:
|
|
41
|
-
verify: "bin/rails test" # command to run before release
|
|
42
|
-
version_file: package.json # single file containing the version
|
|
43
|
-
version_files: # multiple files (overrides version_file)
|
|
44
|
-
- package.json # list EVERY file carrying the version;
|
|
45
|
-
- .claude-plugin/plugin.json # they must all be bumped together or they drift
|
|
46
|
-
- .claude-plugin/marketplace.json
|
|
47
|
-
tag_format: "v{{version}}" # tag naming pattern ({{version}} is replaced)
|
|
48
|
-
on_green: # actions to run after push succeeds
|
|
49
|
-
- github_release
|
|
50
|
-
- npm_publish
|
|
51
|
-
on_complete: commit_and_push # what to do with the version bump commit
|
|
52
|
-
on_red: stop # what to do if verification fails
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**Fallback:** If no project.yml exists or it has no `release:` section, fall back to asking the user for each step - verify command, version files, tag format, and post-push actions.
|
|
56
|
-
|
|
57
|
-
### 1. Verify Tests Pass
|
|
58
|
-
|
|
59
|
-
Run the verification command from `release.verify` in project.yml:
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
# Example: release.verify = "ruby -Itest test/*_test.rb"
|
|
63
|
-
<verify-command-from-config>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
- If `release.verify` is present: run it. All checks must pass before proceeding.
|
|
67
|
-
- If `release.verify` is absent or empty: skip verification. Log that no verify command is configured.
|
|
68
|
-
- If `release.on_red` is `stop`: abort the release on failure.
|
|
69
|
-
- If `release.on_red` is `fix_and_retry`: ask the user to fix and re-run.
|
|
70
|
-
|
|
71
|
-
### 2. Determine Version Bump
|
|
72
|
-
|
|
73
|
-
| Change type | Bump | Example |
|
|
74
|
-
|-------------|------|---------|
|
|
75
|
-
| Breaking changes | Major | 0.x.0 → 1.0.0 |
|
|
76
|
-
| New features | Minor | 0.3.0 → 0.4.0 |
|
|
77
|
-
| Bug fixes only | Patch | 0.4.0 → 0.4.1 |
|
|
78
|
-
|
|
79
|
-
Pre-1.0: minor bumps for features, patch for fixes. No major until stable.
|
|
80
|
-
|
|
81
|
-
### 3. Merge Feature Branch
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
git checkout main
|
|
85
|
-
git merge <branch-name> --no-ff -m "feat: merge intent [ID] - [description]"
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Always `--no-ff` to preserve branch history in the merge commit.
|
|
89
|
-
|
|
90
|
-
**Worktree-isolated intents (intent 73c3).** A worktree-delivered intent's code lives on
|
|
91
|
-
`plastic/{id}--{slug}`, merged together with cleanup in step 9, not on a hand-made feature
|
|
92
|
-
branch. Do not delete the worktree before its branch is merged, or the work is lost. For
|
|
93
|
-
the full rationale and the already-merged-by-hand no-op case, read
|
|
94
|
-
`references/promotion-and-tagging.md`.
|
|
95
|
-
|
|
96
|
-
### 4. Bump Version
|
|
97
|
-
|
|
98
|
-
**Stable-cut guard.** Before touching any version file for a stable (no pre-release suffix,
|
|
99
|
-
`latest`) cut, run the guard in `scripts/lib/release_guard.rb`:
|
|
100
|
-
|
|
101
|
-
```ruby
|
|
102
|
-
require "./scripts/lib/release_guard"
|
|
103
|
-
result = ReleaseGuard.check(
|
|
104
|
-
package_json: "package.json",
|
|
105
|
-
plugin_json: ".claude-plugin/plugin.json",
|
|
106
|
-
marketplace_json: ".claude-plugin/marketplace.json",
|
|
107
|
-
stable: true
|
|
108
|
-
)
|
|
109
|
-
raise "release guard failed: #{result.mismatches} #{result.prerelease_suffix}" unless result.ok?
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
If it reports a mismatch or a pre-release-suffix violation, stop and resolve it before bumping
|
|
113
|
-
any file. For a beta or alpha cut, pass `stable: false`; only version-file agreement is checked,
|
|
114
|
-
a pre-release suffix is expected. Read `references/release-lines.md` for the stable-line
|
|
115
|
-
guarantees this guard protects.
|
|
116
|
-
|
|
117
|
-
Determine which files to update from project.yml:
|
|
118
|
-
|
|
119
|
-
- If `release.version_files` is set: update ALL listed files (they must stay in sync).
|
|
120
|
-
- Else if `release.version_file` is set: update that single file.
|
|
121
|
-
- Else: ask the user which files contain the version.
|
|
122
|
-
|
|
123
|
-
Update the version string in each file, then commit:
|
|
124
|
-
|
|
125
|
-
**Cut the CHANGELOG entry.** Before committing, edit `CHANGELOG.md` at the repo root so
|
|
126
|
-
the changelog change rides this same version-bump commit and reaches the tag. Write one
|
|
127
|
-
line in the existing shape:
|
|
128
|
-
|
|
129
|
-
`` `<version>` - shipped <date>; collected <intent-id> (<one-line summary>) ``
|
|
130
|
-
|
|
131
|
-
Prepend it as the first bullet under `## Released` (newest-first). If this version was
|
|
132
|
-
sitting under `## Unreleased`, move it out of that section and into `## Released`. Keep
|
|
133
|
-
the line intent-centric narrative (which intents the cut collected and why), NOT commit
|
|
134
|
-
detail: step 5's tag-message changelog and step 7's `gh release create --generate-notes`
|
|
135
|
-
already own the commit-level detail, so do not duplicate it here.
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
git add <version-files> CHANGELOG.md
|
|
139
|
-
git commit -m "chore: bump version to X.Y.Z - [one-line summary]"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 5. Create Annotated Tag
|
|
143
|
-
|
|
144
|
-
Read `release.tag_format` from project.yml to determine the tag name:
|
|
145
|
-
|
|
146
|
-
- If set (e.g. `"v{{version}}"`): replace `{{version}}` with the new version string.
|
|
147
|
-
- If not set: default to `vX.Y.Z`.
|
|
148
|
-
|
|
149
|
-
Generate the changelog from commits since the last tag:
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
git log $(git describe --tags --abbrev=0)..HEAD --oneline --no-merges | grep -E "^[a-f0-9]+ (feat|fix|refactor):"
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
Create the tag with a multi-line message:
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
git tag -a <tag-name> -m "<tag-name> - [release name]
|
|
159
|
-
|
|
160
|
-
- [changelog bullet points from feat/fix/refactor commits]"
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### 6. Push
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
git push origin main --tags
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 7. Post-Push Actions
|
|
170
|
-
|
|
171
|
-
Read `release.on_green` from project.yml. This is a list of actions to run after a successful push. Execute each in order:
|
|
172
|
-
|
|
173
|
-
#### `github_release`
|
|
174
|
-
|
|
175
|
-
Create a GitHub release from the tag:
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
gh release create <tag-name> --title "<tag-name> - [release name]" --latest --generate-notes --notes-start-tag <previous-tag>
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
`--latest` is REQUIRED. Pre-release (alpha/beta) tags are NOT auto-promoted to the "Latest"
|
|
182
|
-
badge by GitHub, so without it the Releases page keeps showing an older version as Latest while
|
|
183
|
-
the newest tag sits below it (a real sync drift we hit on the alpha line). Pass `--latest` on
|
|
184
|
-
every release so the newest one always carries the badge. Do NOT pass `--prerelease` unless you
|
|
185
|
-
specifically want the release hidden from Latest.
|
|
186
|
-
|
|
187
|
-
For the first release (no previous tag), write notes manually with `--notes "..."` instead.
|
|
188
|
-
|
|
189
|
-
#### `npm_publish`
|
|
190
|
-
|
|
191
|
-
Publish the package to npm with the appropriate dist-tag:
|
|
192
|
-
|
|
193
|
-
```bash
|
|
194
|
-
# Alpha pre-release (version contains -alpha):
|
|
195
|
-
npm publish --access public --tag alpha
|
|
196
|
-
|
|
197
|
-
# Beta pre-release (version contains -beta):
|
|
198
|
-
npm publish --access public --tag beta
|
|
199
|
-
|
|
200
|
-
# Stable release (no pre-release suffix, >= 1.0.0):
|
|
201
|
-
npm publish --access public
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
The dist-tag is derived from the version string in `package.json`:
|
|
205
|
-
- Contains `-alpha` → `--tag alpha`
|
|
206
|
-
- Contains `-beta` → `--tag beta`
|
|
207
|
-
- No pre-release suffix → no `--tag` flag (publishes to `latest`)
|
|
208
|
-
|
|
209
|
-
#### Other values
|
|
210
|
-
|
|
211
|
-
If `on_green` contains an action not listed above, log it:
|
|
212
|
-
|
|
213
|
-
```
|
|
214
|
-
[releasing] Action "<action>" is configured but not yet implemented. Skipping.
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
If `on_green` is empty or absent: skip post-push actions entirely.
|
|
218
|
-
|
|
219
|
-
#### Verify sync (always, after the post-push actions)
|
|
220
|
-
|
|
221
|
-
A release is not done until all three surfaces show the SAME newest version. Confirm:
|
|
222
|
-
|
|
223
|
-
```bash
|
|
224
|
-
npm view <package> dist-tags # channel tag (alpha/beta/latest) -> new version
|
|
225
|
-
gh release list --limit 1 # newest release is the new tag AND marked "Latest"
|
|
226
|
-
git ls-remote --tags origin | grep <tag-name> # the tag reached the remote
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
If the GitHub "Latest" badge is on an older tag (the common drift), fix it without re-releasing:
|
|
230
|
-
|
|
231
|
-
```bash
|
|
232
|
-
gh release edit <tag-name> --latest
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### 8. Clean Up the Intent's Worktrees (merge-then-remove)
|
|
236
|
-
|
|
237
|
-
This step now runs BEFORE step 9's `end-intent` call (intent 188, D7): `scripts/end-intent`
|
|
238
|
-
gained its own step 5 that disarms (releases the worktree, clears `delivery.lock`) as part
|
|
239
|
-
of every close. Its plain-remove shape does not merge, so if `end-intent` ran first on a
|
|
240
|
-
release, its step 5 would remove the worktree WITHOUT merging the code branch first,
|
|
241
|
-
stranding the integrated work (`Worktree.finish` returns early once the worktree block it
|
|
242
|
-
needs is gone, per `worktree.rb`'s own "no-op if nothing was provisioned" contract).
|
|
243
|
-
Running this merge-then-remove step first means the worktree is already gone by the time
|
|
244
|
-
step 9 runs, so `end-intent`'s own disarm becomes a harmless no-op for the worktree
|
|
245
|
-
(nothing left to remove), while for the FIRST time on this path it also clears the delivery
|
|
246
|
-
lock correctly (G5): before intent 188 this path left the lock stranded, exactly the class
|
|
247
|
-
of bug closed by the End-tail enforcement work.
|
|
248
|
-
|
|
249
|
-
This is the release branch of `plastic-intent-ending`'s Step 5 disarm (`merge: true`), not a
|
|
250
|
-
separate concern: a release is the merge-then-remove path for the intent's worktree (intent
|
|
251
|
-
73c3), so the intent's code branch is merged back into the default branch BEFORE the worktree
|
|
252
|
-
is removed. Drive it through `Worktree.finish` with `merge: true`, which merges the code
|
|
253
|
-
branch, then removes the worktree, and prunes the repo:
|
|
254
|
-
|
|
255
|
-
```bash
|
|
256
|
-
ruby -r ~/.plastic/scripts/lib/worktree -r ~/.plastic/scripts/lib/arm -e \
|
|
257
|
-
'Worktree.finish(Arm.bridge_hash(intent_dir: "<STORE>/<dir>"), merge: true)'
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
(The worktree block is derived from `projects.yml` and the intent id, so the one-liner needs
|
|
261
|
-
only the intent directory; the `/tmp` bridge it once discovered was removed in 2.0, intent 307.)
|
|
262
|
-
|
|
263
|
-
Honor the worktree-cleanup rule: never leave an orphaned worktree, and run `git worktree
|
|
264
|
-
prune` in the affected repo if you hit a stale reference. For why this is the one place the
|
|
265
|
-
merge-vs-remove policy lands on merge, and the fail-open/idempotent guarantees of `finish`,
|
|
266
|
-
read `references/promotion-and-tagging.md`.
|
|
267
|
-
|
|
268
|
-
### 9. Complete Active Intent
|
|
269
|
-
|
|
270
|
-
A release IS a delivery. The active intent that drove this work must be completed as part of the release process. This is NOT optional. The mechanical close (outcome/INDEX/savepoint/commit, AND disarm since intent 188) is `plastic-intent-ending`'s job, not this skill's: run its backing script rather than restating that prose here.
|
|
271
|
-
|
|
272
|
-
1. Read `~/.plastic/INDEX.md` (or the project's INDEX.md) - find active intent(s) related to this release.
|
|
273
|
-
2. For each active intent being delivered:
|
|
274
|
-
a. Write a real `outcome.md` (never leave the scaffold placeholder), `disposition: delivered`, referencing the release tag.
|
|
275
|
-
b. Update `## Insights` with final observations.
|
|
276
|
-
c. Run the mechanical close (`scripts/end-intent`'s steps 1-5): this stamps the intent file's `## Outcome` summary, moves the INDEX.md line to `## Completed` (dated today, with a rich entry description via `--index-note`), appends the savepoint `Done` bookend, commits the store, and disarms (releases the worktree - already gone from step 8 above - and clears `delivery.lock`), all in one call:
|
|
277
|
-
```bash
|
|
278
|
-
ruby ~/.plastic/scripts/end-intent --store <store_path> --id <ID> --disposition delivered \
|
|
279
|
-
--session "$CLAUDE_CODE_SESSION_ID" \
|
|
280
|
-
--outcome-summary "delivered in <tag-name>: <one-line summary>" \
|
|
281
|
-
--index-note "<tag-name>, <mode>; <what shipped>; <suite result>"
|
|
282
|
-
```
|
|
283
|
-
A non-zero exit needs attention: 4 means a live foreign session holds the lock (back
|
|
284
|
-
off), 5 means the code worktree is still dirty (should not happen here, since step 8
|
|
285
|
-
already removed it; investigate before overriding with `--discard-worktree-changes`),
|
|
286
|
-
3 means disarm ran but the lock is still present (run `/plastic-doctor check the lock
|
|
287
|
-
status`).
|
|
288
|
-
d. Update clusters to show `_(completed)_`.
|
|
289
|
-
|
|
290
|
-
**If no active intent exists for this release**, that itself is a problem - work happened outside the intent system. Log it and move on, but flag it.
|
|
291
|
-
|
|
292
|
-
## Release lines and channels
|
|
293
|
-
|
|
294
|
-
Two lanes get code to a release, on top of the workflow above.
|
|
295
|
-
|
|
296
|
-
- **Default lane.** Branch, merge to main, cut stable, publish to npm `latest`. This is the
|
|
297
|
-
workflow in the steps above, unchanged. Use it for additive, suite-verifiable,
|
|
298
|
-
low-blast-radius work.
|
|
299
|
-
- **Beta-verified lane.** Branch, merge to `beta`, publish to the npm `beta` channel, verify in
|
|
300
|
-
real use, then merge to main and cut stable. Use it for work that changes operational
|
|
301
|
-
substrate, or carries data, migration, lock, or state-format risk, or that a hermetic suite
|
|
302
|
-
cannot fully validate on its own.
|
|
303
|
-
|
|
304
|
-
**Stable-line guarantees.** An external `latest` user can rely on:
|
|
305
|
-
|
|
306
|
-
- `main` is always green and releasable; no pending revert awaiting re-land sits on `main`.
|
|
307
|
-
- A stable release carries no pre-release suffix, publishes to `latest`, and the newest release
|
|
308
|
-
always carries the GitHub "Latest" badge.
|
|
309
|
-
- The three version files always agree, checked by `scripts/lib/release_guard.rb` (see Bump
|
|
310
|
-
Version above).
|
|
311
|
-
- A stable cut collects only intents that cleared their lane's verification bar.
|
|
312
|
-
- Channel semantics are fixed: `latest` is stable, `beta` is the verification line, `alpha` is
|
|
313
|
-
experimental.
|
|
314
|
-
|
|
315
|
-
Read `references/release-lines.md` for the full lane-routing detail, the version-line map, and
|
|
316
|
-
the intent-41 re-land playbook.
|
|
317
|
-
|
|
318
|
-
## Conventions
|
|
319
|
-
|
|
320
|
-
- **Annotated tags only** - `git tag -a`, never lightweight tags
|
|
321
|
-
- **Tag format** - driven by `release.tag_format` in project.yml (default: `vX.Y.Z`)
|
|
322
|
-
- **Tag message** - first line: `<tag> - [short name]`, then blank line, then bullet changelog
|
|
323
|
-
- **Commit prefixes** - `feat:`, `fix:`, `refactor:`, `chore:`, `docs:` (conventional commits)
|
|
324
|
-
- **Hyphens, never em-dashes** - in tag names, release titles, and commit messages, use a hyphen (`-`). Never an em-dash.
|
|
325
|
-
- **Latest badge** - always `gh release create --latest`; the newest release must carry GitHub's "Latest" badge.
|
|
326
|
-
- **Version files** - driven by project.yml; list and bump EVERY file carrying the version (they drift otherwise)
|
|
327
|
-
- **Verify sync** - after pushing, confirm npm dist-tag, GitHub "Latest", and the git tag all show the new version
|
|
328
|
-
- **Branch cleanup** - delete merged feature branches: `git branch -d <branch>`
|
|
329
|
-
|
|
330
|
-
## References
|
|
331
|
-
|
|
332
|
-
- Read `references/release-lines.md` for the two release lanes, the stable-line guarantees,
|
|
333
|
-
the version-line map, and the intent-41 re-land playbook before starting any release
|
|
334
|
-
- When promoting a pre-release across channels (alpha to beta, beta to stable) or
|
|
335
|
-
tagging a historical release retroactively, read `references/promotion-and-tagging.md`
|
|
336
|
-
for the exact commands and rules first
|
|
337
|
-
- Read `references/deprecations.md` for the full deprecation process, severity levels, deprecations.yml schema, and dismissal rules when adding or managing deprecations
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Deprecation Process
|
|
2
|
-
|
|
3
|
-
When removing a feature, changing a convention, or making a breaking change:
|
|
4
|
-
|
|
5
|
-
1. Add entry to `deprecations.yml` in the Plastic source root
|
|
6
|
-
2. Set severity: `info` (awareness), `warning` (action needed), `critical` (urgent)
|
|
7
|
-
3. Provide clear migration steps
|
|
8
|
-
4. Set `removal` version at least 2 minor versions ahead
|
|
9
|
-
5. SessionStart hook displays active deprecations automatically
|
|
10
|
-
6. Remove the feature AND the deprecation entry together
|
|
11
|
-
|
|
12
|
-
## Pre-1.0 removal policy
|
|
13
|
-
|
|
14
|
-
The numbered process above is the steady-state rule: a deprecation rides until its `removal`
|
|
15
|
-
version, which step 4 sets at least two minors ahead. While Plastic is still pre-1.0 (any
|
|
16
|
-
version below `1.0.0`), one exception applies:
|
|
17
|
-
|
|
18
|
-
- **Pre-1.0 exception.** Before `1.0.0`, a *satisfied* deprecation (the migration it
|
|
19
|
-
announced is complete on installed machines) may be removed immediately, rather than waiting
|
|
20
|
-
for its declared `removal` major. Delete the entry from `deprecations.yml` (leaving
|
|
21
|
-
`deprecations: []` if it was the last one) the moment the migration is done.
|
|
22
|
-
|
|
23
|
-
This exception only holds below `1.0.0`. From `1.0.0` onward, the steady-state grace rule
|
|
24
|
-
(step 4, removal at least two minors ahead) governs again, unchanged. The exception narrows
|
|
25
|
-
*when* a satisfied entry may be pulled early during the pre-release line; it does not loosen
|
|
26
|
-
the grace window for the released-product contract.
|
|
27
|
-
|
|
28
|
-
## Severity Levels
|
|
29
|
-
|
|
30
|
-
| Severity | When to use | Dismissable? |
|
|
31
|
-
|----------|-------------|--------------|
|
|
32
|
-
| `info` | Upcoming change | Yes |
|
|
33
|
-
| `warning` | Action needed | Yes (re-shown at removal) |
|
|
34
|
-
| `critical` | Urgent/security | Never |
|
|
35
|
-
|
|
36
|
-
## deprecations.yml Schema
|
|
37
|
-
|
|
38
|
-
```yaml
|
|
39
|
-
deprecations:
|
|
40
|
-
- id: unique-slug
|
|
41
|
-
severity: info | warning | critical
|
|
42
|
-
summary: "One-line description"
|
|
43
|
-
migration_steps:
|
|
44
|
-
- "Step 1"
|
|
45
|
-
- "Step 2"
|
|
46
|
-
introduced: "0.9.0"
|
|
47
|
-
removal: "1.0.0"
|
|
48
|
-
link: "optional URL"
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Dismissal
|
|
52
|
-
|
|
53
|
-
Users dismiss by adding the id to `deprecations_dismissed` in `config.yml`:
|
|
54
|
-
|
|
55
|
-
```yaml
|
|
56
|
-
deprecations_dismissed:
|
|
57
|
-
- some-deprecated-feature
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Critical deprecations and final-version warnings ignore dismissal.
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Promotion, Retroactive Tagging, and Worktree Merge Rationale
|
|
2
|
-
|
|
3
|
-
Occasional variant paths off the main release workflow: promoting a pre-release
|
|
4
|
-
across channels, tagging historical releases retroactively, and the deep rationale
|
|
5
|
-
for why the intent's worktree is merged before removal.
|
|
6
|
-
|
|
7
|
-
## Table of Contents
|
|
8
|
-
|
|
9
|
-
- [Worktree merge-then-remove rationale](#worktree-merge-then-remove-rationale)
|
|
10
|
-
- [Promotion](#promotion)
|
|
11
|
-
- [Retroactive Tagging](#retroactive-tagging)
|
|
12
|
-
|
|
13
|
-
## Worktree merge-then-remove rationale
|
|
14
|
-
|
|
15
|
-
**Worktree-isolated intents (intent 73c3).** When the intent was delivered in a Plastic
|
|
16
|
-
worktree (the bridge has a provisioned `worktree` block), its code lives on the branch
|
|
17
|
-
`plastic/{id}--{slug}` inside `<repo>/.claude/worktrees/{id}--{slug}`, not on a hand-made
|
|
18
|
-
feature branch. The merge-then-remove of that worktree is handled together with cleanup in
|
|
19
|
-
Workflow step 9, which merges `plastic/{id}--{slug}` into the default branch BEFORE removing the
|
|
20
|
-
worktree. If you already merged here by hand, step 9 is a clean no-op merge ("Already up to
|
|
21
|
-
date") and proceeds straight to removal. Do not delete the worktree before its branch is
|
|
22
|
-
merged, or the work is lost.
|
|
23
|
-
|
|
24
|
-
A release is the merge-then-remove path for the intent's worktrees. This is the one place
|
|
25
|
-
the merge-vs-remove policy lands on "merge": the intent's code branch (`plastic/{id}--{slug}`)
|
|
26
|
-
is merged back into the repo's default branch BEFORE the worktree is removed, so the
|
|
27
|
-
integrated work is never lost. (The disarm path in `plastic-auto`, by contrast, is a plain
|
|
28
|
-
remove because no release is merging the branch.)
|
|
29
|
-
|
|
30
|
-
`Worktree.finish` is fail-open and idempotent: a conflicting merge is aborted and logged (the
|
|
31
|
-
worktree is still removed rather than stranded), and a second call with the block already
|
|
32
|
-
cleared is a no-op.
|
|
33
|
-
|
|
34
|
-
## Promotion
|
|
35
|
-
|
|
36
|
-
Promotion is not a CLI flag; there is no `--promote` command. It is a set of steps the
|
|
37
|
-
agent performs during the releasing workflow, reusing the normal release mechanics
|
|
38
|
-
(version bump, tag, `npm publish` with the channel's dist-tag, GitHub release):
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
# Promote alpha → beta: set version files from -alpha.N to -beta.1, commit, tag, then
|
|
42
|
-
npm publish --access public --tag beta
|
|
43
|
-
|
|
44
|
-
# Promote beta → stable: strip the pre-release suffix (e.g., 1.0.0-beta.3 → 1.0.0),
|
|
45
|
-
# commit, tag, then
|
|
46
|
-
npm publish --access public # no --tag flag publishes to latest
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**Promotion rules:**
|
|
50
|
-
- Linear only: alpha → beta → stable. Cannot skip channels.
|
|
51
|
-
- Version files are bumped and committed as in a normal release.
|
|
52
|
-
- An annotated tag is created for the promoted version, and the GitHub release is cut
|
|
53
|
-
as in the normal workflow (`gh release create ... --latest` for stable).
|
|
54
|
-
- To point a channel at an already-published version without republishing, move the
|
|
55
|
-
dist-tag directly: `npm dist-tag add @zalom/plastic@<version> <channel>`. To move the
|
|
56
|
-
GitHub "Latest" badge: `gh release edit <tag> --latest`.
|
|
57
|
-
|
|
58
|
-
## Retroactive Tagging
|
|
59
|
-
|
|
60
|
-
For repos without prior tags, tag historical releases:
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
git tag -a v0.1.0 <commit-sha> -m "v0.1.0 - [description]"
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Use `git log --oneline` to find the right commits (look for version bump commits or major feature merges).
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# Release Lines and Channels
|
|
2
|
-
|
|
3
|
-
The two release lanes, the version-line map, and the intent-41 re-land playbook: the deep
|
|
4
|
-
material behind SKILL.md's "Release lines and channels" section.
|
|
5
|
-
|
|
6
|
-
## Table of Contents
|
|
7
|
-
|
|
8
|
-
- [The two lanes](#the-two-lanes)
|
|
9
|
-
- [Routing rule](#routing-rule)
|
|
10
|
-
- [Stable-line guarantees](#stable-line-guarantees)
|
|
11
|
-
- [Version-line map](#version-line-map)
|
|
12
|
-
- [Intent 41 re-land playbook](#intent-41-re-land-playbook)
|
|
13
|
-
|
|
14
|
-
## The two lanes
|
|
15
|
-
|
|
16
|
-
**Default lane.** Branch, merge to `main` with `--no-ff`, cut stable, publish to npm `latest`.
|
|
17
|
-
This is the workflow SKILL.md documents step by step. It is the path for additive,
|
|
18
|
-
suite-verifiable, low-blast-radius work: new skills, prose, deterministic scripts, anything a
|
|
19
|
-
green Minitest run can fully vouch for.
|
|
20
|
-
|
|
21
|
-
**Beta-verified lane.** Branch, merge to the `beta` branch, publish to the npm `beta` dist-tag,
|
|
22
|
-
verify in real use, then merge `beta` into `main` and cut stable. It sits on top of the existing
|
|
23
|
-
promotion mechanics (agent-performed channel promotion, linear only, see
|
|
24
|
-
`promotion-and-tagging.md`); it names when to use them, not new machinery.
|
|
25
|
-
|
|
26
|
-
## Routing rule
|
|
27
|
-
|
|
28
|
-
Work rides the beta-verified lane when it changes operational substrate, carries data,
|
|
29
|
-
migration, lock, or state-format risk, or cannot be fully validated by a hermetic suite alone.
|
|
30
|
-
Everything else merges straight to main.
|
|
31
|
-
|
|
32
|
-
Intent 41's DB layer is the archetypal beta-lane case: it replaces the bridge, lock, and session
|
|
33
|
-
file formats with a new persistent SQLite substrate. A green suite proves the code correct; it
|
|
34
|
-
cannot prove the new substrate survives real, uncontrolled usage, so real-use verification on
|
|
35
|
-
beta comes first.
|
|
36
|
-
|
|
37
|
-
The manual-first roadmap's eight 1.1.0 intents (158a, 163, 161, 164, 165, 168, 166, 159) are all
|
|
38
|
-
default-lane: skill directory renames, prose rewrites, deterministic step scripts. Additive, and
|
|
39
|
-
fully suite-verified.
|
|
40
|
-
|
|
41
|
-
## Stable-line guarantees
|
|
42
|
-
|
|
43
|
-
What an external `latest` user can rely on:
|
|
44
|
-
|
|
45
|
-
1. `main` is always green and releasable. No pending revert awaiting re-land sits on `main`.
|
|
46
|
-
When something needs beta verification, it comes out of `main` the same day that need is
|
|
47
|
-
found (the 226023f precedent), never left half-landed.
|
|
48
|
-
2. A stable release carries no pre-release suffix, publishes to npm `latest`, and the newest
|
|
49
|
-
stable release always carries the GitHub "Latest" badge (`gh release create --latest` on
|
|
50
|
-
every cut).
|
|
51
|
-
3. The three repo version files (`package.json`, `.claude-plugin/plugin.json`,
|
|
52
|
-
`.claude-plugin/marketplace.json`) always agree. Checked mechanically by
|
|
53
|
-
`scripts/lib/release_guard.rb`.
|
|
54
|
-
4. A stable cut collects only intents that cleared their lane's bar: default-lane intents by a
|
|
55
|
-
green suite, beta-lane intents by suite green plus their lane's own verification (real-use
|
|
56
|
-
signal, owner sign-off).
|
|
57
|
-
5. Channel semantics are fixed: `latest` is stable and what an external user should run; `beta`
|
|
58
|
-
is the verification line, published but expected to move; `alpha` is experimental,
|
|
59
|
-
pre-verification.
|
|
60
|
-
|
|
61
|
-
## Version-line map
|
|
62
|
-
|
|
63
|
-
| Line | State | What lands here |
|
|
64
|
-
|---|---|---|
|
|
65
|
-
| `1.1.x` | Current stable line (main) | Additive or low-risk work merged straight to main; interim stable cuts, including 171's wave-6 cut, stay in this line |
|
|
66
|
-
| `1.2.0-beta.1` | On beta (`9ec194b`, unpublished) | Intent 41's DB layer, restored over 1.1.0 by revert-of-revert (`c48601a` then `9ec194b`) |
|
|
67
|
-
| `1.2.0` | Reserved | The stable graduation of the DB layer, once beta verification passes; not claimed by any interim `1.1.x` cut |
|
|
68
|
-
|
|
69
|
-
A beta-graduated substrate change claims its reserved minor at the moment it actually merges to
|
|
70
|
-
main, not before. Nothing else on the `1.1.x` line is blocked waiting for `1.2.0`.
|
|
71
|
-
|
|
72
|
-
## Intent 41 re-land playbook
|
|
73
|
-
|
|
74
|
-
Written for the wave-6 cut intent (171) and any future reader to pick a version without
|
|
75
|
-
re-deriving this decision.
|
|
76
|
-
|
|
77
|
-
**Current state.** The revert-of-revert already sits on the `beta` branch at `9ec194b`, on top
|
|
78
|
-
of 1.1.0, versioned `1.2.0-beta.1` (`c48601a`). There is nothing left to execute on the git side;
|
|
79
|
-
this playbook describes what happens next, not a pending action.
|
|
80
|
-
|
|
81
|
-
**Preconditions**, both required before any npm publish of `1.2.0-beta.1`:
|
|
82
|
-
|
|
83
|
-
- (a) One documentation pass over beta-line skills and docs for the hybrid savepoint contract:
|
|
84
|
-
on beta, only the terminal Done bookend still writes a live `savepoint.md`; every other
|
|
85
|
-
milestone lives in `savepoint_events` plus a committed JSONL export. Beta-line prose that
|
|
86
|
-
still assumes an always-live ledger needs updating first, so a beta-line reader does not
|
|
87
|
-
mistake an empty ledger for a broken one.
|
|
88
|
-
- (b) The owner's manual verification of the DB layer in real use. This is a dogfood signal,
|
|
89
|
-
distinct from the independently-reviewed green suite that already exists on beta.
|
|
90
|
-
|
|
91
|
-
**Trigger**, owner-gated: the owner publishes `1.2.0-beta.1` to the npm `beta` dist-tag. This is
|
|
92
|
-
explicitly not this intent's, nor any agent's, call to make.
|
|
93
|
-
|
|
94
|
-
**Verification.** An external tester plus the owner verify the DB layer on the beta channel.
|
|
95
|
-
|
|
96
|
-
**Completion.** Once verified, `beta` merges into `main`, `1.2.0` is cut stable, and it publishes
|
|
97
|
-
to npm `latest`.
|
|
98
|
-
|
|
99
|
-
**Version mechanics.** `1.2.0` is reserved for this graduation. The `1.1.x` line stays the
|
|
100
|
-
stable line until `1.2.0` actually lands. `1.2.0-beta.1` graduates to `1.2.0` stable by dropping
|
|
101
|
-
the pre-release suffix; nothing else about the version number changes.
|
|
102
|
-
|
|
103
|
-
**Consumed by 171.** The wave-6 consistency-dividend cut stays in the `1.1.x` line. It does not
|
|
104
|
-
ride intent 41 and needs no further derivation: intent 41 keeps its own `1.2.0` line on beta,
|
|
105
|
-
independent of whatever `1.1.x` number 171 lands on.
|
package/skills/roadmap/SKILL.md
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plastic-roadmap
|
|
3
|
-
description: Use when the user wants to plan a delivery batch, order waves of intents, ship a batch of intents in one go, track a named collection of intents toward a goal, or asks for a "roadmap". Creates and maintains a roadmap file, a delivery-side collection of intents (the counterpart to a release), separate from INDEX.md status tracking.
|
|
4
|
-
user-invocable: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Roadmap
|
|
8
|
-
|
|
9
|
-
A roadmap is a named, ordered, delivery-side collection of intents: the delivery-side counterpart
|
|
10
|
-
to a release (completion-side, `CHANGELOG.md`). It lives at `roadmaps/{slug}.md`, a sibling of
|
|
11
|
-
`INDEX.md` wherever `INDEX.md` lives: the global tier's `~/.plastic/roadmaps/` (beside
|
|
12
|
-
`~/.plastic/INDEX.md`), or a project's root, `~/.plastic/projects/{slug}/roadmaps/` (beside that
|
|
13
|
-
project's `INDEX.md` and `project.yml`). It never sits inside `store/`, which holds intent
|
|
14
|
-
directories, not project artifacts.
|
|
15
|
-
|
|
16
|
-
A roadmap file has four parts: a title/meta header, `## Goal` (prose), `## Batches` (ordered;
|
|
17
|
-
entries inside a batch are parallel-safe, batches run sequentially), and an append-only dated
|
|
18
|
-
`## Log`. A roadmap written before owner ruling 145 may instead use the legacy `## Waves` heading;
|
|
19
|
-
reading accepts both, but every new roadmap is scaffolded with `## Batches`, and an existing
|
|
20
|
-
roadmap file's heading is never renamed to migrate it. Each batch entry mirrors that intent's
|
|
21
|
-
status in `INDEX.md` (`queued`/`delivering`/`delivered`/`abandoned`/`blocked`).
|
|
22
|
-
|
|
23
|
-
**`INDEX.md` is the single writer of intent status; on any conflict INDEX wins and the roadmap
|
|
24
|
-
entry is corrected to match.**
|
|
25
|
-
|
|
26
|
-
The skill operates on the roadmap file directly via Read/Edit. The one deterministic helper it
|
|
27
|
-
uses is the savepoint ledger writer (`scripts/roadmap-savepoint`, `append`/`rebuild`); every verb's
|
|
28
|
-
closing step calls `append` after its Read/Edit, and the roadmap `.md` file itself stays
|
|
29
|
-
Read/Edit-only.
|
|
30
|
-
|
|
31
|
-
## Verbs
|
|
32
|
-
|
|
33
|
-
| Verb | When | Mechanics |
|
|
34
|
-
|------|------|-----------|
|
|
35
|
-
| Create | user wants to start a new roadmap / plan a delivery batch | `references/operations.md#create` |
|
|
36
|
-
| Add / reorder entries | user wants to add intents to a batch or resequence batches | `references/operations.md#add--reorder-entries` |
|
|
37
|
-
| Sync status mirror | an entry's status may be stale against INDEX | `references/operations.md#sync-status-mirror` |
|
|
38
|
-
| Append log line | a roadmap event just happened (created, batch done, closed) | `references/operations.md#append-a-log-line` |
|
|
39
|
-
| Read / consume | a human or a coordinator needs the roadmap's current state | `references/operations.md#read--consume` |
|
|
40
|
-
| Close / archive | the roadmap's `## Goal` is reached | `references/operations.md#close--archive` |
|
|
41
|
-
|
|
42
|
-
See `references/file-format.md` for the exact entry-line shape, status vocabulary, checkbox/log
|
|
43
|
-
format, and a worked example. See `references/operations.md` for step-by-step mechanics of each
|
|
44
|
-
verb above.
|
|
45
|
-
|
|
46
|
-
Read `../plastic-conventions/references/roadmaps.md` for the roadmap file format, batch
|
|
47
|
-
semantics, and the status-mirror rule that this skill's own file-format reference builds on. This
|
|
48
|
-
path resolves relative to this skill's own installed directory.
|
|
49
|
-
|
|
50
|
-
## Notes
|
|
51
|
-
|
|
52
|
-
- File location and the four-section shape are identical across tiers; do not invent a different
|
|
53
|
-
layout per project. The general rule: `roadmaps/` is a sibling of `INDEX.md`, wherever `INDEX.md`
|
|
54
|
-
lives.
|
|
55
|
-
- `## Goal` is a checkable prose condition read by a human or agent, not an executable checker.
|
|
56
|
-
- Batch entries render as checkboxes (`- [x] ... — delivered` / `- [ ] ... — <status>`); a human
|
|
57
|
-
reading cold should see shipped/running/next within a minute. `## Log` lines are one-sentence,
|
|
58
|
-
EM-to-CTO-voice, dated, and link each entry-intent's `outcome.md` (lossless-by-reference).
|
|
59
|
-
- Additive: this skill introduces no gate, lock, or hook, and does not change `INDEX.md`'s section
|
|
60
|
-
list or the intent frontmatter schema.
|
|
61
|
-
- Closing a roadmap moves it to `roadmaps/archived/{slug}.md` so `roadmaps/` lists only live ones.
|
|
62
|
-
- Every verb also appends a machine ledger line to the roadmap's name-paired
|
|
63
|
-
`roadmaps/{slug}.savepoint.md`, the derived counterpart to the human `## Log`; see
|
|
64
|
-
`references/file-format.md` for its shape and location.
|