canopy-prompt-workflow
Compose a canopy prompt by inheriting from a base prompt and emit the rendered result. Use when an agent needs to author, update, or render canopy prompts inside this repo.
معلومات المصدر
- المستودع
- jayminwest/canopy
- آخر نشاط في المصدر
- ٢٧ مايو ٢٠٢٦ في ٢١:٤٨
- لغة SKILL.md المكتشفة
- الإنجليزية
- النجوم
- ٤١
- التفرعات
- ١٢
خيارات التثبيت
يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.
مراجعة ملفات المصدر
اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.
عرض SKILL.md
SKILL.md
تعليمات المصدر · معاينة للقراءة فقط- name
- canopy-prompt-workflow
- description
- Compose a canopy prompt by inheriting from a base prompt and emit the rendered result. Use when an agent needs to author, update, or render canopy prompts inside this repo.
- tools
- ["bun","git"]
- inputs
- ["prompt-name (kebab-case, e.g. `builder-agent`)","parent-name (optional; defaults to no inheritance)"]
- outputs
- ["new or updated record appended to `.canopy/prompts.jsonl`","rendered `.md` file under the configured emit target (if `cn emit` is run)"]
# canopy-prompt-workflow
Use this skill when you are an agent working inside the canopy repo and
you need to **compose a new prompt by inheritance, then emit the
rendered result to disk**. It encodes the canonical prompt-authoring
loop documented in `SPEC.md` so an agent can do it from a cold start
without re-reading the full design record.
## Pre-flight
The repo must already be initialised. Verify:
```bash
ls .canopy/ # config.yaml + prompts.jsonl + schemas.jsonl
bunx cn doctor # exits 0 when the store is healthy
```
If `.canopy/` is missing, run `bunx cn init` first. If `cn doctor`
reports problems, fix them (or escalate) before continuing — never
hand-edit `.canopy/prompts.jsonl` to "fix" things; use `cn` commands so
locks + atomic writes are honoured.
## Procedure
### 1. Decide the prompt's shape
A canopy prompt is a JSONL record with named sections. Before touching
the CLI, write down:
- The prompt's stable `name` (kebab-case, must be unique in the store).
- Its **parent** (the `extends:` target), if it inherits. Pick the
most specific base whose sections you want to inherit.
- The minimum set of `sections` (`name`, `body`, optional `required`)
the new prompt adds or overrides. Inheriting sections is preferred
over duplicating them — that is the whole point of canopy.
- The `schema` it should validate against, if any (see
`.canopy/schemas.jsonl`).
### 2. Inspect existing prompts
```bash
bun run src/index.ts list # lists all prompts
bun run src/index.ts show <parent-name> # see the parent's sections
bun run src/index.ts tree <parent-name> # full inheritance tree
```
If a sibling prompt already does most of what you want, extend it
instead of forking — every duplicated section is one more place a
future edit will drift.
### 3. Create or update the prompt
To **create** a new prompt by inheritance:
```bash
bun run src/index.ts create \
--name <prompt-name> \
--extends <parent-name> \
--section role:"You are ..." \
--section constraints:"- Never push to canonical branch"
```
To **update** an existing prompt (appends a new version; never
overwrites):
```bash
bun run src/index.ts update <prompt-name> \
--section quality-gates:"Run bun test, bun run lint, bun run typecheck before closing."
```
`cn create` and `cn update` both append to `.canopy/prompts.jsonl`
through `src/store.ts` (advisory file lock + atomic write). Two agents
in different worktrees can run them concurrently.
### 4. Render and validate
Before emitting, confirm the rendered prompt resolves cleanly:
```bash
bun run src/index.ts render <prompt-name> # human-readable
bun run src/index.ts render <prompt-name> --json # for inspection
bun run src/index.ts validate <prompt-name> # against its schema
```
`cn render` resolves the inheritance chain (last-write wins per
section name) and prints the merged record. `cn validate` reports any
missing required sections or rule-pattern violations.
### 5. Emit to disk
```bash
bun run src/index.ts emit <prompt-name> # one prompt
bun run src/index.ts emit --all # everything
```
`cn emit` resolves each prompt's target directory in this order:
1. Per-prompt `emitDir` override (if set in frontmatter).
2. First target in `.canopy/config.yaml` whose `tags:` match one of the
prompt's tags.
3. The target marked `default: true` in `.canopy/config.yaml`.
4. Fallback to `agents/`.
By default canopy emits `.md`; if the resolved target's `emitAs` ends
in `.ts`, the prompt is rendered as a TypeScript string export
instead. **Do not manually edit emitted files** — they are the
projection of the JSONL store and will be overwritten on the next
`cn emit`.
### 6. Stage and commit
```bash
bun run src/index.ts sync # stages .canopy/ + emitted files
git diff --cached # review the additions
git commit -m "prompts: add <prompt-name> (extends <parent-name>)"
```
`cn sync` is preferred over `git add .canopy/` because it also stages
the configured emit-target directories so the JSONL truth and the
rendered files stay in lockstep.
## Acceptance
The skill is complete when **all** of the following hold:
- `bun run src/index.ts list` shows `<prompt-name>`.
- `bun run src/index.ts render <prompt-name>` exits 0 and prints the
merged sections.
- `bun run src/index.ts validate <prompt-name>` exits 0.
- The rendered `.md` (or `.ts`) appears under the resolved target
directory.
- `git status` is clean after `git commit` lands.
- `bun run check:agents` and `bun run gen:docs:check` still exit 0.
## Failure modes
| Symptom | Likely cause | Remedy |
|---------|--------------|--------|
| `cn render` errors "prompt not found" | Misspelled name, or you ran `cn create` from a directory without `.canopy/`. | Re-run from canopy repo root; double-check the name. |
| `cn validate` reports missing required section | Schema's `requiredSections` not satisfied by the merged result. | Add the missing section via `cn update`, then re-validate. |
| `cn emit` writes to the wrong directory | Target-resolution order picked the wrong target. | Add explicit `tags:` to the prompt or set `emitDir` in frontmatter. |
| Concurrent edits collide | Two agents wrote at once and `cn` couldn't acquire the advisory lock. | Re-run the failed command; the lock is short-lived and the write is atomic, so a retry is safe. |
## Further reading
- `SPEC.md` — canopy's V1 design record (sections, inheritance,
storage, lifecycle).
- `README.md` — user-facing pitch and command examples.
- `docs/cli-reference.md` — auto-generated reference for every `cn`
subcommand.
- `docs/architecture.mmd` — flowchart of the prompt-resolution path.
- `AGENTS.md` — repo-wide conventions and quality gates.
عرض على GitHub