name: plastic-creating-project description: >- Create a new project from an implementation intent. Sets up project directory, git init, AGENTS.md with founding intent decisions, plastic-install --local, tactical mirror, projects.yml registration, and framework scaffolding. Use when an implementation intent spawns a project, or manually by user.
Creating a Project
Announce: "Creating project <slug> from intent [ID] — [name]."
Precondition
An active intent must exist with enough context to define a project — at minimum: name/slug, path, and key decisions from ## Context > ### Decisions.
Workflow
1. Determine Project Identity
- Slug: derived from intent name (kebab-case, 2-4 words) or user-specified
- Path: from
~/.plastic/config.ymlproject_roots(first entry as default), or user-specified - Confirm path with user before creation
2. Create Project Directory
mkdir -p <project_root>/<slug>
cd <project_root>/<slug>
git init
3. Run plastic-install --local
Invoke plastic-install --local in the project directory. This creates:
.plastic/
├── store/
├── INDEX.md
└── config.yml
4. Populate AGENTS.md
Create AGENTS.md in the project root with:
# <Project Name> — Agent Instructions
Read `PLASTIC.md` in `~/.plastic/`. It contains all Plastic conventions.
Follow it exactly.
This file is the operating contract for this project. Any agent entering
this project reads this file first.
## Global Store
Location: `~/.plastic/`
Governing intent(s): <list of founding intent IDs with descriptions>
## Decisions
<Copy ALL decisions from founding intent(s)' `## Context > ### Decisions`>
Each decision should include:
- The decision itself
- The rationale (why this choice)
- Date decided
## Project-Specific Rules
<Any rules derived from the decisions — e.g., "Use Minitest, not RSpec",
"37signals methodology", "sqlite-vec for vector storage">
5. Create Tactical Mirror
Create the first intent in the project's store at ~/.plastic/projects/{slug}/store/:
Directory: ~/.plastic/projects/{slug}/store/1--{slug}/
File: ~/.plastic/projects/{slug}/store/1--{slug}/1--{slug}.md
---
id: '1'
intent: "<same description as founding intent>"
sources: ["global:<founding_intent_ID>"]
chain: []
created: <today>
author: <same as founding intent author>
tags: [<relevant tags>]
---
Sections:
## Intent— same as founding intent## Context— carry forward relevant Context and Decisions## Outcome— (pending)## Insights— empty## Links—[[global:<founding_intent_ID>|<founding intent name>]]
Update the project's ~/.plastic/projects/{slug}/INDEX.md:
# Index
## Active
- [1 — <intent name>](store/1--<slug>/1.md) — implementation, from: global:<ID>
For multi-intent spawning (Hub):
sources:["global:<id1>", "global:<id2>", ...]— all founding intents- All founding intents' decisions merge into AGENTS.md
- Context carries forward from all founding intents
6. Register in projects.yml
Read ~/.plastic/projects.yml and add:
<slug>:
path: <full-path>
parent: "<founding_intent_ID>"
registered: <today>
status: active
For Hub-spawned projects, parent references the primary founding intent.
7. Provision the Project Store
The provision-project-store verb is the single source of truth for store
creation. Run it after the project is registered in step 6 (the provisioner
requires registration), and before the QMD step:
ruby ~/.plastic/scripts/provision-project-store <slug>
This ensures ~/.plastic/projects/<slug>/store/ exists with .gitkeep, and
writes INDEX.md and project.yml only if missing. It is idempotent, so it is
safe even when the tactical mirror in step 5 already created the store directory.
Do not create the store with an inline mkdir; the provisioner is the only place
a store is made. For a project that is already registered but store-less, use the
plastic-add-project-store skill instead.
8. Mark Global Intent(s) Completed
For each founding intent:
- Write
## Outcomein the intent file:"Spawned project
<slug>at<path>. Decisions carried to AGENTS.md. Tactical mirror:project-<slug>:1." - Write
outcome.mdwith full details (all decisions, project path, tactical mirror ID) - Update
chainto includeproject-<slug>:1 - Move from
## Activeto## Completedin~/.plastic/INDEX.md(with today's date)
9. Framework Scaffolding
If decisions specify a framework, run the appropriate scaffolding command AFTER steps 3-4 (so scaffolding doesn't overwrite Plastic files or AGENTS.md):
| Framework | Command |
|---|---|
| Rails | rails new <slug> [options from decisions] --skip-git (skip git — already initialized) |
| Node/npm | npm init -y |
| Ruby gem | bundle gem <slug> |
| Other | As specified in decisions |
After scaffolding, verify AGENTS.md and .plastic/ still exist. If scaffolding overwrote them, restore.
10. Auto-commit Both Stores
cd ~/.plastic && git add . && git commit -m "feat: spawn project <slug> from intent <ID>"
cd <project> && git add . && git commit -m "feat: initialize project from intent <ID>"
11. Register the project store with QMD (optional)
If QMD is installed, register the new project's store as a search collection:
ruby ~/.plastic/scripts/qmd-sync register --store ~/.plastic/projects/<slug>/store
qmd-sync no-ops when QMD is absent, so run it unconditionally. This adds the
plastic-<slug> collection and indexes it.
12. Announce
Log in ## Insights of each founding intent:
"Project
<slug>created at<path>. Tactical mirror:project-<slug>:1(autonomous)"
Announce to user:
"Project
<slug>created at<path>. AGENTS.md populated with [N] decisions from [founding intent IDs]. Tactical mirror1is now the active intent in the project store."
References
- Read
references/hubs-projects.mdfor the full hub/project relationship model, project creation flow, and cross-linking conventions