129 lines
5.4 KiB
Markdown
129 lines
5.4 KiB
Markdown
---
|
|
name: project
|
|
description: >
|
|
Switch between named ongoing projects, each with its own persistent
|
|
context, carried forward across turns until the user switches or ends it.
|
|
Triggers on: "project X", "switch to project X", "we're working on X",
|
|
"end project" / "no project". For a long-lived, named work context — not a
|
|
single task to plan and execute, and not a short or global fact to
|
|
remember.
|
|
---
|
|
|
|
# Project
|
|
|
|
Named, long-lived work contexts. Each project keeps its own instructions, its
|
|
own history, its own current-state summary, and its own generated files —
|
|
separate from every other project and from the agent's general memory.
|
|
|
|
## Layout
|
|
|
|
`workspace/projects/<slug>/`:
|
|
|
|
- `prompt.md` — project-specific context/instructions, read in full whenever
|
|
the project becomes active
|
|
- `memory.md` — append-only chronological log of decisions and history
|
|
- `state.md` — living document: the current state/synthesis of the project,
|
|
edited in place, not appended to
|
|
- `artifacts/` — generated files (documents, code, data exports, reports)
|
|
|
|
**Which project is active is tracked purely through conversation memory —
|
|
nothing is persisted to disk for that.** Once a project is chosen, keep
|
|
treating it as active for the rest of this conversation; don't re-read its
|
|
files on every subsequent turn once they're already in context.
|
|
|
|
## Activation
|
|
|
|
Triggered by "project X" / "switch to project X" / "we're working on X":
|
|
|
|
1. Turn `X` into a kebab-case directory name (like picking a slug for a plan
|
|
file — no need to spell out an algorithm, just pick something sensible).
|
|
2. **`workspace/projects/<slug>/` already exists** → read `prompt.md`,
|
|
`memory.md`, and `state.md` in full, then briefly confirm what's active
|
|
and, if `prompt.md` or `state.md` has content, what context you loaded.
|
|
3. **It doesn't exist, but the name is a close match to one or more existing
|
|
projects** (case-insensitive) → ask which one was meant. Don't guess, and
|
|
don't create a near-duplicate of an existing project.
|
|
4. **It doesn't exist and there's no close match** → this skill only works
|
|
with projects that already exist without asking. Ask the user whether to
|
|
start a new project with that name. Only on explicit yes, create
|
|
`prompt.md`, `memory.md`, `state.md` (all empty) and `artifacts/`. Never
|
|
create a project just because a trigger phrase was said.
|
|
|
|
**Already active:** if the same project is already active in this
|
|
conversation, don't re-create or re-read anything — just continue.
|
|
|
|
## Staying active
|
|
|
|
Once a project is active, keep applying its `prompt.md` instructions and
|
|
`state.md` context for the rest of the conversation, until the user switches
|
|
or ends it.
|
|
|
|
If a long gap or an ambiguous reference makes it unclear whether the project
|
|
is still the right context (e.g. the conversation has clearly moved to an
|
|
unrelated topic), ask rather than silently carrying it forward or silently
|
|
dropping it.
|
|
|
|
## Switching and ending
|
|
|
|
- **"switch to Y"** → run the Activation flow for Y; Y becomes active
|
|
instead.
|
|
- **"end project" / "no project" / "stop working on X"** → stop treating any
|
|
project as active. Say so. Don't delete anything.
|
|
- With no active project, behave normally — never force a project onto an
|
|
unrelated request.
|
|
|
|
## Writing to memory.md
|
|
|
|
Append only — never rewrite or reorder existing entries. One entry per
|
|
decision, dead end, or noteworthy piece of history:
|
|
|
|
```
|
|
- YYYY-MM-DD: <terse entry, reformulated, not verbatim>
|
|
```
|
|
|
|
Write an entry when a decision is made, a dead end is found, or a fact
|
|
central to the project's ongoing context emerges — not for routine
|
|
back-and-forth. When in doubt whether something is memory-worthy, prefer not
|
|
writing it; `memory.md` is for what a future conversation needs to pick up
|
|
the thread, not a transcript.
|
|
|
|
## Maintaining state.md
|
|
|
|
Unlike `memory.md`, `state.md` is edited in place: surgically update the
|
|
relevant section when the project's current state or understanding has
|
|
moved on enough that the old text would mislead a reader. It answers "where
|
|
is this now", not "what happened" — old content gets replaced, not appended
|
|
to. If it's still empty and the project has accumulated enough context to
|
|
synthesize, offer to draft it.
|
|
|
|
## Artifacts
|
|
|
|
Files generated while working on the project (documents, code, data exports,
|
|
reports) go in `workspace/projects/<slug>/artifacts/` instead of scattered
|
|
elsewhere. Name them descriptively; no numbering or index file needed at
|
|
this scale.
|
|
|
|
## Listing
|
|
|
|
**"list projects" / "which projects exist":** list the directory names under
|
|
`workspace/projects/`. If none exist, say so.
|
|
|
|
## Edge cases
|
|
|
|
- "project" with no name → ask which project.
|
|
- The project directory exists but one or more of `prompt.md` / `memory.md`
|
|
/ `state.md` is missing (e.g. created by hand) → create the missing
|
|
file(s) empty, don't error.
|
|
- Deleting or renaming a project is out of scope for this skill — point the
|
|
user at `workspace/projects/<slug>/` to do it by hand.
|
|
|
|
## Rules
|
|
|
|
- This skill's body is English; reply to the user in their own language.
|
|
- Never fabricate project content — `prompt.md`, `memory.md`, and `state.md`
|
|
only grow from what the user actually said or what actually happened.
|
|
- Never create a new project without the user's explicit confirmation.
|
|
- Don't force a project context onto an unrelated request.
|
|
- The Dream memory processor must not touch `workspace/projects/` — it is
|
|
outside the memory and skills Dream curates.
|