@zalom/plastic 1.0.2 → 1.0.3

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.
Files changed (38) hide show
  1. package/PLASTIC.md +30 -0
  2. package/agents/plastic-intent-discovery.md +1 -0
  3. package/package.json +1 -1
  4. package/scripts/dashboard.rb +1 -1
  5. package/scripts/doctor.rb +3 -3
  6. package/scripts/lib/bridge.rb +11 -10
  7. package/scripts/lib/dashboard_banner.rb +1 -1
  8. package/scripts/lib/lock.rb +3 -3
  9. package/skills/add-project-store/SKILL.md +1 -0
  10. package/skills/auto/SKILL.md +1 -0
  11. package/skills/auto/references/agent-report-contract.md +3 -0
  12. package/skills/brainstorming/SKILL.md +1 -0
  13. package/skills/brainstorming-grill-me/SKILL.md +1 -0
  14. package/skills/continuing/SKILL.md +1 -0
  15. package/skills/creating-intent/SKILL.md +1 -0
  16. package/skills/creating-project/SKILL.md +1 -0
  17. package/skills/creating-skills/SKILL.md +1 -0
  18. package/skills/creating-skills/references/skills.md +1 -0
  19. package/skills/dashboard/SKILL.md +1 -0
  20. package/skills/doctor/SKILL.md +1 -0
  21. package/skills/evaluating-skills/SKILL.md +1 -0
  22. package/skills/executing-plan/SKILL.md +1 -0
  23. package/skills/humanizer/SKILL.md +1 -0
  24. package/skills/install/SKILL.md +1 -0
  25. package/skills/intent-curator/SKILL.md +1 -0
  26. package/skills/intent-discovery/SKILL.md +2 -0
  27. package/skills/intent-starting/SKILL.md +1 -0
  28. package/skills/linking-intents/SKILL.md +1 -0
  29. package/skills/lock/SKILL.md +2 -1
  30. package/skills/managing-index/SKILL.md +1 -0
  31. package/skills/releasing/SKILL.md +1 -0
  32. package/skills/research/SKILL.md +3 -0
  33. package/skills/roadmap/SKILL.md +1 -0
  34. package/skills/savepoint/SKILL.md +1 -0
  35. package/skills/uninstall/SKILL.md +1 -0
  36. package/skills/update/SKILL.md +1 -0
  37. package/skills/versions/SKILL.md +1 -0
  38. package/skills/writing-plans/SKILL.md +1 -0
package/PLASTIC.md CHANGED
@@ -370,6 +370,36 @@ cache) over re-reading them from disk, which only widens context. QMD is for OTH
370
370
  intents, not for re-reading what you just wrote. Pairs with `/clear` plus savepoint-resume
371
371
  hygiene after each intent. Advisory self-check, not hard-verifiable.
372
372
 
373
+ ## Tabular-First Reporting (intent 160)
374
+
375
+ **Default.** Tabular layout is the default shape for three surfaces: What-stage discovery
376
+ deposits, all research reports, and all agent reporting or presentation surfaces.
377
+
378
+ **Calibration.** Tables are REQUIRED for any listing or discussion of intents, and for
379
+ explaining complex data, comparisons, or multi-factor reasoning. This is NOT a blanket
380
+ tables-everywhere rule: simple data stays prose, and tables must not be overused.
381
+
382
+ **Bullets-limit.** Use bullets only when a table genuinely does not fit the content, and
383
+ never more than 3-5 items.
384
+
385
+ **Why tables.**
386
+
387
+ | # | Reason |
388
+ |---|--------|
389
+ | 1 | Parallel structure makes comparison a row-vs-row scan, not a re-read. |
390
+ | 2 | Coverage is provable: N items means N rows, an empty cell exposes a gap while a missing bullet hides it. |
391
+ | 3 | Schema stated once in the headers, no repeated labels, higher density. |
392
+ | 4 | A column reads vertically to show every value at once. |
393
+ | 5 | Cells force terseness where bullets sprawl and nest. |
394
+ | 6 | A ruling or decision column turns the report into the decision worksheet. |
395
+ | 7 | Rows stay machine-readable for downstream tooling. |
396
+ | 8 | Uniform granularity: every item answers the same questions. |
397
+ | 9 | Line-scoped git diffs. |
398
+
399
+ **Exception.** The EM-to-CTO human briefing (`skills/auto/references/human-report-contract.md`)
400
+ keeps its deliberate prose shape (fixed State/Risk/Call, single item, nothing to tabulate) and
401
+ is exempt from this rule.
402
+
373
403
  ## Retrieval Gate
374
404
 
375
405
  Advisory. Hard gates guard writes, locks, and structure, never reads or searches. Read,
@@ -24,6 +24,7 @@ for the Why stage to consume.
24
24
  the intent file, spec.md, or any lifecycle deliverable: the lock-owner-only
25
25
  write rule stays intact, and the Why-stage `plastic-brainstorming` agent is
26
26
  the one that reads your deposit and enriches `## Context`.
27
+ Shape the deposit tabular-first per `PLASTIC.md` (## Tabular-First Reporting, intent 160).
27
28
 
28
29
  ## Constraints
29
30
  - Read-only with respect to the intent: your single output is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zalom/plastic",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Intent-driven idea development system for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -466,7 +466,7 @@ def render_continue(records)
466
466
  out.concat(matrix(open, scope_tag: true))
467
467
  out << ""
468
468
  out << LEGEND
469
- out << "run plastic-dashboard project <slug> · plastic-auto (works the dispatchable queue)"
469
+ out << "ask for the <slug> project board · plastic-auto (works the dispatchable queue)"
470
470
  out.join("\n") + "\n"
471
471
  end
472
472
 
package/scripts/doctor.rb CHANGED
@@ -676,9 +676,9 @@ class Doctor
676
676
  message: "#{stalled.size} stalled completion#{stalled.size == 1 ? "" : "s"} " \
677
677
  "(terminal in INDEX but the End tail did not finish)",
678
678
  details: stalled, fixable: true,
679
- fix_hint: "Finish the End tail via stale-lock reclaim: `plastic-lock reclaim`, then complete the " \
680
- "tail (Worktree.release -> Lock.release -> purge -> QMD reindex last). This FINISHES a " \
681
- "completion; it is NOT a reactivation of a done intent."
679
+ fix_hint: "Finish the End tail via stale-lock reclaim: run /plastic-doctor reclaim the lock, " \
680
+ "then complete the tail (Worktree.release -> Lock.release -> purge -> QMD reindex " \
681
+ "last). This FINISHES a completion; it is NOT a reactivation of a done intent."
682
682
  )
683
683
  end
684
684
 
@@ -741,17 +741,18 @@ module Bridge
741
741
  data["lock"] = lock_cache(lock_data)
742
742
  when :held
743
743
  raise LockHeldError, "delivery lock for intent #{intent_id} is held by " \
744
- "session #{lock_data && lock_data['owner_session']}; run /plastic-lock status"
744
+ "session #{lock_data && lock_data['owner_session']}; run /plastic-doctor " \
745
+ "check the lock status"
745
746
  when :stale
746
747
  raise LockHeldError, "delivery lock for intent #{intent_id} is stale " \
747
- "(owner #{lock_data && lock_data['owner_session']}); run /plastic-lock " \
748
- "reclaim to take it over with an audit"
748
+ "(owner #{lock_data && lock_data['owner_session']}); run /plastic-doctor " \
749
+ "reclaim the lock to take it over with an audit"
749
750
  when :excluded
750
751
  raise LockHeldError, "a #{lock_data && lock_data['type']} lock is active on " \
751
- "intent #{intent_id}; run /plastic-lock status"
752
+ "intent #{intent_id}; run /plastic-doctor check the lock status"
752
753
  when :corrupt
753
754
  raise LockHeldError, "delivery.lock for intent #{intent_id} is unreadable; " \
754
- "run /plastic-lock fix"
755
+ "run /plastic-doctor fix the lock"
755
756
  end
756
757
 
757
758
  # Provision the per-intent worktrees (mandatory code worktree for project
@@ -861,7 +862,7 @@ module Bridge
861
862
  end
862
863
  return { "status" => "stale", "owner" => lock["owner_session"],
863
864
  "actions" => actions, "session" => key,
864
- "hint" => "run /plastic-lock reclaim to take over with an audit" }
865
+ "hint" => "run /plastic-doctor reclaim the lock to take over with an audit" }
865
866
  end
866
867
 
867
868
  if lock
@@ -1002,16 +1003,16 @@ module Bridge
1002
1003
  "#{lock['owner_session']}. Back off; if you are the owner's " \
1003
1004
  "subagent, the owner must run: plastic-lock delegate " \
1004
1005
  "--intent-dir #{target_dir} --session <your-session-id>. " \
1005
- "Inspect with /plastic-lock status"
1006
+ "Inspect with /plastic-doctor check the lock status"
1006
1007
  end
1007
1008
  return solo_allow(id, "stale delivery lock") if solo
1008
1009
  return "intent #{id} has a stale delivery lock (owner " \
1009
- "#{lock['owner_session']}); run /plastic-lock reclaim to take " \
1010
- "it over, or /plastic-lock fix"
1010
+ "#{lock['owner_session']}); run /plastic-doctor reclaim the lock to " \
1011
+ "take it over, or /plastic-doctor fix the lock"
1011
1012
  end
1012
1013
  if Lock.corrupt?(target_dir)
1013
1014
  return solo_allow(id, "unreadable delivery.lock") if solo
1014
- return "delivery.lock for intent #{id} is unreadable; run /plastic-lock fix"
1015
+ return "delivery.lock for intent #{id} is unreadable; run /plastic-doctor fix the lock"
1015
1016
  end
1016
1017
  return solo_allow(id, "no delivery lock") if solo
1017
1018
  "no delivery lock held for intent #{id}; run /plastic-intent-starting " \
@@ -20,7 +20,7 @@ module DashboardBanner
20
20
  return nil unless counts.is_a?(Hash)
21
21
  active = counts["active"].to_i
22
22
  future = counts["future"].to_i
23
- line = "Plastic: #{active} active · #{future} next · run /plastic-dashboard to see the board"
23
+ line = "Plastic: #{active} active · #{future} next · say \"show the dashboard\" to see the board"
24
24
  nbt = next_big_thing_id(payload)
25
25
  line += " · next big thing: #{nbt}" if nbt
26
26
  line
@@ -368,8 +368,8 @@ module Claim
368
368
  holder = data && data["owner_session"]
369
369
  since = data && data["acquired_at"]
370
370
  "artifact #{artifact} is claimed by #{holder} since #{since}; another writer holds " \
371
- "it. Back off or run /plastic-lock status. If you are a distinct delegate, the " \
372
- "owner must register you: plastic-lock delegate --intent-dir #{intent_dir} " \
373
- "--session <your-session-id>"
371
+ "it. Back off or run /plastic-doctor check the lock status. If you are a distinct " \
372
+ "delegate, the owner must register you: plastic-lock delegate --intent-dir " \
373
+ "#{intent_dir} --session <your-session-id>"
374
374
  end
375
375
  end
@@ -6,6 +6,7 @@ description: >-
6
6
  when you need to provision a store, or when doctor reports a missing project
7
7
  store (project_store_dir). Thin wrapper around provision-project-store plus an
8
8
  optional qmd register step.
9
+ user-invocable: false
9
10
  ---
10
11
 
11
12
  # Add a Project Store
@@ -4,6 +4,7 @@ description: >-
4
4
  Autonomous intent delivery — agent takes over How and Exec. Use when user says
5
5
  "auto", "take it from here", "deliver this", or when brainstorming-grill-me concludes
6
6
  and user confirms autonomous execution. Requires an active intent in INDEX.md.
7
+ user-invocable: true
7
8
  ---
8
9
 
9
10
  # Auto — Autonomous Intent Delivery
@@ -47,6 +47,9 @@ Every role report, whatever the stage, carries these fields:
47
47
 
48
48
  ## Per-role payload
49
49
 
50
+ Multi-item payload fields (ordered actions, insights, checklist deltas) default to tables per
51
+ `PLASTIC.md` (## Tabular-First Reporting, intent 160); single fields stay prose.
52
+
50
53
  Each role appends a payload that fulfils its place in the What, Why, How, Exec cycle (decision
51
54
  D2). The payload is what makes the report useful to the orchestrator beyond the envelope.
52
55
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-brainstorming
3
3
  description: "Explore intent requirements and design before implementation. Produces spec.md in the active intent directory."
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Brainstorming Ideas Into Designs
@@ -4,6 +4,7 @@ description: >-
4
4
  Deep brainstorming that interviews the user relentlessly about a plan or design until reaching shared understanding.
5
5
  Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
6
6
  Pair with plastic-brainstorming for quick ideation and use grill-me for thorough interrogation. If superpowers:brainstorming is installed it complements this skill, but it is not required.
7
+ user-invocable: true
7
8
  ---
8
9
 
9
10
  # Grill Me — Deep Brainstorming
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-continuing
3
3
  description: Use when the user says "continue", "resume", or "pick up where we left off", or when starting a new session. Continues work with the latest project context: lands on the right dashboard, then presents choices. Boot (health check, core context, version, statusline) is owned by the SessionStart hook, not this skill. Does not drive work autonomously (that is plastic-auto).
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Continuing
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-creating-intent
3
3
  description: Use when new work begins, the user expresses a new goal, says "new intent", or no active intent exists for the current task. Creates intents in the global store (~/.plastic/store/) or in a project's store (~/.plastic/projects/{slug}/store/) depending on context.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Creating an Intent
@@ -5,6 +5,7 @@ description: >-
5
5
  git init, AGENTS.md with founding intent decisions, plastic-install --local,
6
6
  tactical mirror, projects.yml registration, and framework scaffolding.
7
7
  Use when an implementation intent spawns a project, or manually by user.
8
+ user-invocable: true
8
9
  ---
9
10
 
10
11
  # Creating a Project
@@ -9,6 +9,7 @@ description: >
9
9
  when an agent keeps missing a step or ignoring instructions, or when the user
10
10
  says "progressive disclosure", "write a skill", "thin router", "split into
11
11
  references", or "make this slim".
12
+ user-invocable: true
12
13
  ---
13
14
 
14
15
  # Creating Skills
@@ -102,6 +102,7 @@ Use only the documented optionals below. Add nothing beyond them [A6].
102
102
  | `allowed-tools` | Space-separated tool list (experimental) |
103
103
  | `model` | Claude Code extension: pin the model for this skill |
104
104
  | `disable-model-invocation` | Claude Code extension: only the user may fire the skill |
105
+ | `user-invocable` | Claude Code extension: set false to hide the skill from the user's / slash menu while leaving it agent-invocable; default true |
105
106
  | `context: fork` | Claude Code extension: run the body as a forked task |
106
107
  | `paths` | Claude Code extension: scope the skill to matching paths |
107
108
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-dashboard
3
3
  description: Use when the user wants an overview of intents, asks "where are we", "what's next", "what should I work on", "show the dashboard", or invokes /plastic-dashboard. Renders a deterministic Value×Effort work cockpit as Markdown across the global store and all projects, and emits a machine-readable queue that auto mode consumes.
4
+ user-invocable: false
4
5
  ---
5
6
 
6
7
  # Dashboard — Plastic Work Cockpit
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-doctor
3
3
  description: Use when diagnosing Plastic installation health, after updates, or when something seems broken. Runs checks and reports findings with fix options.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Doctor: Plastic Health Check
@@ -8,6 +8,7 @@ description: >
8
8
  skill, checking if a description triggers correctly, or assessing
9
9
  whether a skill is still needed. Also use when the user says "evaluate",
10
10
  "test the skill", "run evals", "check conventions", or "write evals".
11
+ user-invocable: true
11
12
  ---
12
13
 
13
14
  # Evaluating Skills
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-executing-plan
3
3
  description: Use when you have a written implementation plan to execute. Default mode is subagent-driven (dispatches fresh subagent per task with two-stage review). Fallback mode is inline execution for environments without subagent support. If superpowers:subagent-driven-development or superpowers:executing-plans are available, delegates to them.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Executing a Plan
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-humanizer
3
3
  description: Use to clean authored prose so it reads human and clutter-free. Removes AI tells and slop from a document, spec, outcome, README, report, or release note. Use when the user says "humanize", "de-slop", "remove the AI tells", or "clean up the wording". For documents, not for every chat reply, and not for code.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Humanizer
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-install
3
3
  description: Use when initializing Plastic globally (~/.plastic/) or locally in a project, or to re-install/repair a broken installation. Accepts channel flags (--alpha, --beta, --latest) to select release channel. First install defaults to --beta; 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
4
5
  ---
5
6
 
6
7
  # Install Plastic
@@ -11,6 +11,7 @@ description: |
11
11
  user: "Organize the intents"
12
12
  assistant: "I'll use the intent-curator to review clusters, flag orphans, and suggest connections"
13
13
  <commentary>Periodic maintenance of the Zettelkasten structure.</commentary></example>
14
+ user-invocable: false
14
15
  ---
15
16
 
16
17
  # Intent Curator
@@ -6,6 +6,7 @@ description: >-
6
6
  resources/discovery--<slug>.md for the Why stage to consume. Use when an intent
7
7
  is activated (moved from Future to Active), after the lock is armed, under it,
8
8
  and before Why begins. Never writes the intent file itself.
9
+ user-invocable: false
9
10
  ---
10
11
 
11
12
  # Intent Discovery — What-stage context deposit
@@ -33,6 +34,7 @@ lock. Dispatched as the `plastic-intent-discovery` background agent.
33
34
  the intent file, spec.md, or any lifecycle deliverable. The lock-owner-only
34
35
  write rule stays intact; the Why-stage `plastic-brainstorming` agent reads the
35
36
  deposit and enriches `## Context`.
37
+ Shape the deposit tabular-first per `PLASTIC.md` (## Tabular-First Reporting, intent 160).
36
38
 
37
39
  ## Stage coverage
38
40
  This is the What-stage agent in the one-agent-per-stage table (What:
@@ -5,6 +5,7 @@ description: >-
5
5
  guided ONCE, then resume at the latest delivered station and run the cycle to Done. Use on
6
6
  `continuing --intent {id}`, when a new intent is registered and the user asks to work it,
7
7
  or when the user picks an intent to work. Requires the intent in INDEX `## Active`.
8
+ user-invocable: true
8
9
  ---
9
10
 
10
11
  # Intent Starting — board a session onto an intent
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-linking-intents
3
3
  description: Use when creating connections between intents, the user says "link" or "connect", or when discovering that two intents are related. Manages sources, chain, and cross-reference links.
4
+ user-invocable: false
4
5
  ---
5
6
 
6
7
  # Linking Intents
@@ -1,6 +1,7 @@
1
1
  ---
2
- name: lock
2
+ name: plastic-lock
3
3
  description: Inspect, repair, release, or reclaim an intent's delivery lock. Use when a lock-gate deny names /plastic-lock, when resuming interrupted work after a crash, reboot, or /tmp wipe, when a lock reads held or stale, or when the user says "fix the lock", "who holds the lock", or "reclaim the lock".
4
+ user-invocable: false
4
5
  ---
5
6
 
6
7
  # Plastic Lock
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-managing-index
3
3
  description: Use after creating, completing, or abandoning intents, when the user says "index" or "organize", or when INDEX.md needs maintenance. Curates the INDEX.md structure note.
4
+ user-invocable: false
4
5
  ---
5
6
 
6
7
  # Managing the Index
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-releasing
3
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
4
5
  ---
5
6
 
6
7
  # Releasing
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-research
3
3
  description: "Research a topic for the active intent. Agent decides shallow vs deep based on scope. Produces reports in the intent's resources/ directory."
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Research
@@ -81,6 +82,8 @@ Examples:
81
82
 
82
83
  ### Report Structure
83
84
 
85
+ Default to tabular-first per `PLASTIC.md` (## Tabular-First Reporting, intent 160): tables for findings and comparisons, prose for simple summaries.
86
+
84
87
  ```markdown
85
88
  # {Type}: {Topic}
86
89
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-roadmap
3
3
  description: Use when the user wants to plan a delivery batch, order waves of intents, ship a batch of tickets 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
4
5
  ---
5
6
 
6
7
  # Roadmap
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-savepoint
3
3
  description: Use when verifying or repairing an intent's savepoint ledger, when the user says "save" or "savepoint", or when a PreCompact hook fires. The ledger is written automatically by the gate hook at each lifecycle boundary; this skill only reads, verifies, and rebuilds it.
4
+ user-invocable: false
4
5
  ---
5
6
 
6
7
  # Savepoint
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-uninstall
3
3
  description: Use when the user wants to remove Plastic from an agent. Runs the manifest-driven uninstaller (removes skills, hooks, statusline, and any legacy plugin layout), reports exactly what was removed and what was left behind, then gives verification steps. Optionally deletes the intent store.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Uninstall Plastic
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-update
3
3
  description: Use when updating Plastic. Runs the `update` verb, which reads the installed VERSION, derives its channel, queries npm dist-tags, and advances to the next version on that channel (or switches channel with a flag).
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Update Plastic
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-versions
3
3
  description: Use when the user wants to see their Plastic version history or roll back to a previously-installed version after a bad release. Manages the local, append-only versions.json ledger and steps between versions the user has actually run. For moving to a brand-new release, use plastic-update instead.
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Plastic Versions: local version time-machine
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: plastic-writing-plans
3
3
  description: "Write implementation plans from a spec. Produces plan.md, checklist.md, and actions/ in the active intent directory."
4
+ user-invocable: true
4
5
  ---
5
6
 
6
7
  # Writing Plans