@codepassion/skills 1.2.0 → 1.5.0
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/README.md +6 -1
- package/SKILLS.md +6 -1
- package/bin/c9n-skills.js +28 -3
- package/install.sh +25 -2
- package/package.json +1 -1
- package/skills/c9n/SKILL.md +322 -0
- package/skills/c9n-pipeline/SKILL.md +171 -0
- package/skills/c9n-pipeline/templates/Dockerfile.api +49 -0
- package/skills/c9n-pipeline/templates/Dockerfile.service +45 -0
- package/skills/c9n-pipeline/templates/Dockerfile.web +55 -0
- package/skills/c9n-pipeline/templates/dockerignore +18 -0
- package/skills/c9n-pipeline/templates/workflows/_build-job.partial.yml +13 -0
- package/skills/c9n-pipeline/templates/workflows/_deploy-job.partial.yml +17 -0
- package/skills/c9n-pipeline/templates/workflows/_migration-check.partial.yml +16 -0
- package/skills/c9n-pipeline/templates/workflows/ci.yml +50 -0
- package/skills/c9n-pipeline/templates/workflows/deployment.yml +21 -0
- package/skills/c9n-sentry/REFERENCE.md +172 -0
- package/skills/c9n-sentry/SKILL.md +53 -0
- package/skills/c9n-spec/SKILL.md +92 -0
- package/skills/c9n-spec/templates/.github/pull_request_template.md +29 -0
- package/skills/c9n-spec/templates/AGENTS.md +179 -0
- package/skills/c9n-spec/templates/CLAUDE.md +6 -0
- package/skills/c9n-spec/templates/CONTEXT.md +53 -0
- package/skills/c9n-spec/templates/DESIGN.md +73 -0
- package/skills/c9n-spec/templates/docs/SRS.md +37 -0
- package/skills/c9n-spec/templates/docs/adr/0001-spec-driven-iso29110-docs.md +44 -0
- package/skills/c9n-spec/templates/docs/adr/_TEMPLATE.md +26 -0
- package/skills/c9n-spec/templates/docs/agents/domain.md +43 -0
- package/skills/c9n-spec/templates/docs/agents/issue-tracker.md +22 -0
- package/skills/c9n-spec/templates/docs/agents/triage-labels.md +27 -0
- package/skills/c9n-spec/templates/docs/architecture.md +50 -0
- package/skills/c9n-spec/templates/docs/features/_TEMPLATE.md +34 -0
- package/skills/c9n-spec/templates/docs/test-plan.md +30 -0
- package/skills/c9n-spec/templates/docs/traceability.md +27 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
AI-assisted development context for the **{{PROJECT_NAME}}** repo.
|
|
4
|
+
|
|
5
|
+
> This is the canonical agent file. `CLAUDE.md` is a one-line pointer to it. Codex, Cursor,
|
|
6
|
+
> OpenCode, and Claude Code all read this file.
|
|
7
|
+
|
|
8
|
+
## Spec-Driven Development Protocol (read first)
|
|
9
|
+
|
|
10
|
+
This repo follows a spec-driven, ISO/IEC 29110-aligned documentation system (Software
|
|
11
|
+
Implementation work products). This section is the **canonical source** — agents MUST follow it.
|
|
12
|
+
The repo is authoritative.
|
|
13
|
+
|
|
14
|
+
### Doc map
|
|
15
|
+
|
|
16
|
+
| File | ISO 29110 work product | Holds |
|
|
17
|
+
| ---------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------- |
|
|
18
|
+
| `AGENTS.md` / `CLAUDE.md` | — (agent protocol) | This protocol + stack + patterns |
|
|
19
|
+
| [`CONTEXT.md`](CONTEXT.md) | Domain glossary | Ubiquitous language only — no implementation |
|
|
20
|
+
| [`DESIGN.md`](DESIGN.md) | — (visual design system) | UI design language: color/type/component **intent & rules** (values in code) |
|
|
21
|
+
| [`docs/SRS.md`](docs/SRS.md) | Requirements Specification | Master registry: features + requirement IDs + system NFRs |
|
|
22
|
+
| [`docs/architecture.md`](docs/architecture.md) | Software Design | System map, module boundaries, data model, integrations |
|
|
23
|
+
| [`docs/traceability.md`](docs/traceability.md) | Traceability Record | Master index: requirement → design → test |
|
|
24
|
+
| [`docs/test-plan.md`](docs/test-plan.md) | Test Cases & Procedures | Master test strategy |
|
|
25
|
+
| `docs/adr/NNNN-*.md` | Architecture Decisions | One ADR per hard-to-reverse decision |
|
|
26
|
+
| `docs/features/<name>.md` | Per-feature deep doc | Sections: Requirements · Design · Test Plan · Test Cases · Traceability |
|
|
27
|
+
|
|
28
|
+
**Master-then-split (two levels):** a feature starts as a section in the master files →
|
|
29
|
+
graduates to its own `docs/features/<name>.md` when it outgrows the section → graduates to a
|
|
30
|
+
folder `docs/features/<name>/` (one file per section) only when a _section_ outgrows one file.
|
|
31
|
+
Default to the smallest form that fits.
|
|
32
|
+
|
|
33
|
+
**Feature ID:** every functional feature has a unique **short-code** — a 2–4 letter
|
|
34
|
+
human-readable mnemonic (`PAY`, `INV`, `AUTH`). The short-code _is_ the feature ID; it prefixes
|
|
35
|
+
all the feature's child IDs. Short-codes are **append-only** — pick a fresh, unused one for a new
|
|
36
|
+
feature (check `docs/SRS.md`), and never reuse one even after a feature is removed. `docs/SRS.md`
|
|
37
|
+
is the authoritative registry.
|
|
38
|
+
|
|
39
|
+
**Child IDs:** feature-prefixed, append-only — `PAY-REQ-001` (requirement), `PAY-TC-001` (test
|
|
40
|
+
case). Never reuse or renumber.
|
|
41
|
+
|
|
42
|
+
**"Design" disambiguation:** `DESIGN.md` = **visual** design (UI). The `## Design` sections in
|
|
43
|
+
`docs/features/*.md` and `docs/architecture.md` = **software** design (engineering). Different
|
|
44
|
+
layers — don't conflate them.
|
|
45
|
+
|
|
46
|
+
### Approval gates (no code before blueprint)
|
|
47
|
+
|
|
48
|
+
A new feature passes three sequential gates, each needing the owner's sign-off:
|
|
49
|
+
|
|
50
|
+
1. **SRS approved** — the _what_ (requirements + acceptance criteria).
|
|
51
|
+
2. **Design + Test Plan approved** — the _how_ + how we'll prove it.
|
|
52
|
+
3. **Code** — only now. The PR links the approved docs.
|
|
53
|
+
|
|
54
|
+
### Definition of Ready (before touching code)
|
|
55
|
+
|
|
56
|
+
1. Read [`CONTEXT.md`](CONTEXT.md) (glossary) and [`docs/architecture.md`](docs/architecture.md) (system map).
|
|
57
|
+
2. Identify the feature; read its `docs/features/<name>.md` (or its master SRS section).
|
|
58
|
+
3. For **UI work**, also read [`DESIGN.md`](DESIGN.md) first.
|
|
59
|
+
4. For a **new feature**, Gate 1 **and** Gate 2 must already be approved. **No production code
|
|
60
|
+
before Gate 2 sign-off.**
|
|
61
|
+
|
|
62
|
+
### Definition of Done (before opening the PR)
|
|
63
|
+
|
|
64
|
+
Apply the **behavior-change rule**: update docs **iff** the change alters observable behavior, a
|
|
65
|
+
requirement, an interface, or a test outcome.
|
|
66
|
+
|
|
67
|
+
| Change kind | Doc action |
|
|
68
|
+
| -------------------------------------------- | -------------------------------------------------------------- |
|
|
69
|
+
| New/changed requirement | Update SRS + traceability + test cases |
|
|
70
|
+
| Behavior/architecture change | Update design (+ ADR if hard-to-reverse) + affected test cases |
|
|
71
|
+
| Bug fix toward spec | Add a regression test case |
|
|
72
|
+
| Visual _intent_ change | Update `DESIGN.md` |
|
|
73
|
+
| Token _value_ change in Tailwind/CSS | No doc update (`DESIGN.md` references values, never copies) |
|
|
74
|
+
| Refactor / rename / dep-bump / typo / format | No doc update (code-only PR) |
|
|
75
|
+
|
|
76
|
+
The `.github/pull_request_template.md` checklist is the merge gate.
|
|
77
|
+
|
|
78
|
+
### Reverse-documentation policy
|
|
79
|
+
|
|
80
|
+
Existing shipped modules each get an **as-built stub** in `docs/features/` (reverse-documented
|
|
81
|
+
from code, **not grilled** — requirements describe current behavior at low confidence, no test
|
|
82
|
+
cases). When a module is next touched, **deepen its stub** to the full chain (acceptance criteria
|
|
83
|
+
+ Test Cases + Traceability) for the part you change — don't try to deepen the whole stub at once.
|
|
84
|
+
New features still get the full chain up front via the gates.
|
|
85
|
+
|
|
86
|
+
## C9N engineering conventions (referenced, not duplicated)
|
|
87
|
+
|
|
88
|
+
These follow the Code Passion skill family — the single source of truth. Don't restate the rules
|
|
89
|
+
here; consult the skill:
|
|
90
|
+
|
|
91
|
+
| Topic | Skill |
|
|
92
|
+
| ---------------- | --------------------------- |
|
|
93
|
+
| Commit messages | `c9n-commit-messages` |
|
|
94
|
+
| Git branching | `c9n-git-branching` |
|
|
95
|
+
| Pull requests | `c9n-pull-requests` |
|
|
96
|
+
| Code review | `c9n-code-review` |
|
|
97
|
+
| Clean Code (TS) | `c9n-clean-code-typescript` |
|
|
98
|
+
| ESLint / types | `c9n-typescript-eslint` |
|
|
99
|
+
| Formatting | `c9n-code-formatting` |
|
|
100
|
+
| SemVer / deploy | `c9n-semver-deployment` |
|
|
101
|
+
|
|
102
|
+
Install: `npx @codepassion/skills install claude`.
|
|
103
|
+
|
|
104
|
+
## Tech Stack
|
|
105
|
+
|
|
106
|
+
C9N defaults — trim rows this project doesn't use.
|
|
107
|
+
|
|
108
|
+
| Layer | Technology |
|
|
109
|
+
| ---------- | ------------------------------------------------ |
|
|
110
|
+
| Runtime | Bun |
|
|
111
|
+
| API | ElysiaJS |
|
|
112
|
+
| Frontend | Next.js / React (or Astro) |
|
|
113
|
+
| Database | PostgreSQL via Drizzle ORM |
|
|
114
|
+
| Storage | Supabase Storage + Auth |
|
|
115
|
+
| Build | Turborepo (monorepo) |
|
|
116
|
+
| Validation | Zod (shared with Drizzle via drizzle-zod) |
|
|
117
|
+
| Lint | ESLint + Prettier (no semicolons, double quotes) |
|
|
118
|
+
| Commits | Conventional Commits (commitlint + Husky) |
|
|
119
|
+
|
|
120
|
+
## Project Structure
|
|
121
|
+
|
|
122
|
+
<!-- Describe the actual repo layout here. C9N monorepo default: -->
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
{{PROJECT_NAME}}/
|
|
126
|
+
apps/
|
|
127
|
+
api/ -- backend (if any)
|
|
128
|
+
web/ -- frontend (if any)
|
|
129
|
+
packages/
|
|
130
|
+
database/ -- Drizzle ORM schemas + client
|
|
131
|
+
...
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
<!-- =========================================================================
|
|
135
|
+
API MODULE PATTERNS — delete this whole section for a web-only repo.
|
|
136
|
+
========================================================================= -->
|
|
137
|
+
|
|
138
|
+
## API Module Structure (delete if no backend)
|
|
139
|
+
|
|
140
|
+
Each feature lives under `apps/api/src/modules/<feature>/`:
|
|
141
|
+
|
|
142
|
+
```text
|
|
143
|
+
modules/<feature>/
|
|
144
|
+
models/ -- Zod schemas + types as namespace exports
|
|
145
|
+
use-cases/ -- Business logic as abstract static classes
|
|
146
|
+
services/ -- External API / infrastructure integrations
|
|
147
|
+
models.ts -- Barrel export
|
|
148
|
+
use-cases.ts -- Barrel export
|
|
149
|
+
constants.ts -- Shared constants
|
|
150
|
+
types.ts -- Shared TS interfaces
|
|
151
|
+
index.ts -- Elysia route definitions
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Key patterns
|
|
155
|
+
|
|
156
|
+
- **Models** — Zod `namespace` pattern; error messages as `z.literal()` so they're both
|
|
157
|
+
type-safe constants and response schema.
|
|
158
|
+
- **Use cases** — `abstract class` with a public `static execute(...)`; private `static` helpers
|
|
159
|
+
hold the how. `execute()` reads like a table of contents (each line a clear step), no inline
|
|
160
|
+
env-extraction/conditional-throw/DB-query.
|
|
161
|
+
- **Services** — same abstract-static shape, wrapping external integrations.
|
|
162
|
+
- **Routes** — `new Elysia({ prefix })`; `throw status(404, "...")` for HTTP errors.
|
|
163
|
+
- **Enum value objects** — `as const satisfies Record<string, T>` for type-safe dot access.
|
|
164
|
+
|
|
165
|
+
<!-- ===================== END deletable API section ===================== -->
|
|
166
|
+
|
|
167
|
+
## Environment Variables
|
|
168
|
+
|
|
169
|
+
<!-- List required env vars and which module/package consumes each. -->
|
|
170
|
+
|
|
171
|
+
| Variable | Used by |
|
|
172
|
+
| -------------- | ------- |
|
|
173
|
+
| `DATABASE_URL` | … |
|
|
174
|
+
|
|
175
|
+
## Code Style
|
|
176
|
+
|
|
177
|
+
Per `c9n-code-formatting` + `c9n-typescript-eslint`: no semicolons, double quotes, no trailing
|
|
178
|
+
commas. Barrel exports per subdirectory. Use the project's error-reporting path (e.g.
|
|
179
|
+
`Sentry.captureException`) — no `console.error`/`console.log` for errors.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Domain Glossary & Project Context
|
|
2
|
+
|
|
3
|
+
> **Glossary only — no implementation detail.** This file is the ubiquitous language of the
|
|
4
|
+
> project: what each term *means*. Code, schemas, and decisions live elsewhere (`docs/`). Keep it
|
|
5
|
+
> a dictionary, not a spec. Produced/maintained via `/grill-with-docs`.
|
|
6
|
+
|
|
7
|
+
## Actors
|
|
8
|
+
|
|
9
|
+
<!-- Who interacts with the system, and how they authenticate / what they can do. -->
|
|
10
|
+
|
|
11
|
+
### <Actor>
|
|
12
|
+
|
|
13
|
+
- …
|
|
14
|
+
|
|
15
|
+
## Core Entities
|
|
16
|
+
|
|
17
|
+
<!-- The nouns of the domain. For each: code term, customer-facing term, definition,
|
|
18
|
+
statuses/lifecycle, key fields. Example shape below — replace it. -->
|
|
19
|
+
|
|
20
|
+
### <Entity> (<local-language term if any>)
|
|
21
|
+
|
|
22
|
+
- **Code term:** `<table_name>` (database), `/<route>` (API)
|
|
23
|
+
- **Customer-facing term:** "…"
|
|
24
|
+
- **Definition:** …
|
|
25
|
+
- **Statuses:** … → … → …
|
|
26
|
+
- **Lifecycle:** … → … → …
|
|
27
|
+
|
|
28
|
+
## External Integrations
|
|
29
|
+
|
|
30
|
+
<!-- Third-party services and what they do for the domain — not how they're wired. -->
|
|
31
|
+
|
|
32
|
+
### <Service>
|
|
33
|
+
|
|
34
|
+
- …
|
|
35
|
+
|
|
36
|
+
## Data Model (Key Relationships)
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
<Entity A> → <Entity B> (1:N)
|
|
40
|
+
…
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Key Business Decisions
|
|
44
|
+
|
|
45
|
+
<!-- Domain rules a newcomer would get wrong. One line each. -->
|
|
46
|
+
|
|
47
|
+
- …
|
|
48
|
+
|
|
49
|
+
## Glossary Hygiene
|
|
50
|
+
|
|
51
|
+
- When output names a domain concept, use the term **as defined here** — don't drift to synonyms.
|
|
52
|
+
- If a needed concept isn't here yet: either you're inventing language the project doesn't use
|
|
53
|
+
(reconsider) or there's a real gap (resolve it via `/grill-with-docs`).
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# DESIGN.md — {{PROJECT_NAME}} Visual Design System
|
|
2
|
+
|
|
3
|
+
Visual design language for AI-assisted UI generation. This governs the **web app**.
|
|
4
|
+
|
|
5
|
+
> **This file is intent + rules, not a token dump.** Raw token _values_ live in code and are the
|
|
6
|
+
> source of truth — never copy them here (they would drift). This file documents what code can't
|
|
7
|
+
> express: when to use what, and why.
|
|
8
|
+
|
|
9
|
+
## Source of truth (read these for values)
|
|
10
|
+
|
|
11
|
+
| What | File |
|
|
12
|
+
| ----------------------------------- | ------------------------------------- |
|
|
13
|
+
| Palette, breakpoints, fonts, radius | `<tailwind.config.*>` |
|
|
14
|
+
| Semantic tokens (light/dark CSS) | `<globals.css>` |
|
|
15
|
+
| shadcn config | `<components.json>` |
|
|
16
|
+
| Component inventory | `<src/components/>` |
|
|
17
|
+
|
|
18
|
+
When generating UI, read the files above for exact values. Use this document for the rules below.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Brand intent
|
|
23
|
+
|
|
24
|
+
<!-- One paragraph: what the product is, the feeling, the guiding aesthetic principle. -->
|
|
25
|
+
|
|
26
|
+
Guiding principles:
|
|
27
|
+
|
|
28
|
+
- **<Principle>** — …
|
|
29
|
+
|
|
30
|
+
## Color usage rules
|
|
31
|
+
|
|
32
|
+
- **Semantic first.** Build with semantic tokens (`background`, `foreground`, `primary`, `muted`,
|
|
33
|
+
`accent`, `border`, `ring`) so light/dark mode works automatically. Reach for raw primitives
|
|
34
|
+
only for brand moments the semantic set can't express.
|
|
35
|
+
- **<Accent> = brand accent.** Primary CTAs, active states, key numbers. Used sparingly.
|
|
36
|
+
- **Destructive is functional, not decorative** — errors and irreversible actions only.
|
|
37
|
+
|
|
38
|
+
## Typography rules
|
|
39
|
+
|
|
40
|
+
- **<Display face> for headings, <body face> for everything else.** Map new headings to an
|
|
41
|
+
existing tier; don't re-roll heading styles.
|
|
42
|
+
- **<Locale> note** — every text style must render the primary language cleanly; verify with real
|
|
43
|
+
content, not Latin placeholder.
|
|
44
|
+
|
|
45
|
+
## Layout & spacing
|
|
46
|
+
|
|
47
|
+
- **Mobile-first** against the project breakpoints.
|
|
48
|
+
- Use the grid utilities for gutters/rhythm rather than ad-hoc padding.
|
|
49
|
+
- Radius is consistent — derive from the `--radius` token.
|
|
50
|
+
|
|
51
|
+
## Components
|
|
52
|
+
|
|
53
|
+
- **shadcn is the base layer.** Extend primitives; don't fork them. Domain components compose them.
|
|
54
|
+
- **Match the existing component vocabulary** before inventing a new one — check the inventory.
|
|
55
|
+
|
|
56
|
+
## Dark mode
|
|
57
|
+
|
|
58
|
+
Class-based. Both themes fully defined in code. Always build with semantic tokens; never hardcode
|
|
59
|
+
a hex that only works in one theme.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Maintenance (behavior-change rule for design)
|
|
64
|
+
|
|
65
|
+
| Change | Action |
|
|
66
|
+
| ----------------------------------------------------------------- | ----------- |
|
|
67
|
+
| **Visual _intent_** changes (accent role, type-pairing, aesthetic) | Update this file |
|
|
68
|
+
| A **token _value_** changes in config/CSS | Code-only — no update here |
|
|
69
|
+
| New reusable component pattern with usage rules | Add a line under Components |
|
|
70
|
+
|
|
71
|
+
This file is a standing reference (like `CONTEXT.md`), not a gated per-feature work product. It is
|
|
72
|
+
**visual** design only; **software** design lives in `docs/architecture.md` and the `## Design`
|
|
73
|
+
sections of `docs/features/*.md`. See `AGENTS.md › Spec-Driven Development Protocol`.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Software Requirements Specification (SRS) — Master Registry
|
|
2
|
+
|
|
3
|
+
ISO/IEC 29110 Requirements Specification work product. This is the **registry** of all features
|
|
4
|
+
and their requirement IDs. A feature starts as a section here; when it outgrows a section it
|
|
5
|
+
graduates to a single file `docs/features/<name>.md` (with a one-line pointer below); only when a
|
|
6
|
+
section within that file outgrows one file does it split into a `docs/features/<name>/` folder.
|
|
7
|
+
|
|
8
|
+
This registry is also the authoritative list of **feature IDs**: each feature's `Short-code` is
|
|
9
|
+
its unique ID (2–4 letter mnemonic) and prefixes all its requirement/test IDs. Short-codes are
|
|
10
|
+
append-only — a new feature picks a fresh, unused code; never reuse one. See
|
|
11
|
+
[`AGENTS.md`](../AGENTS.md) for the full ID convention and approval gates.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Feature registry
|
|
16
|
+
|
|
17
|
+
| Feature | Short-code | Status | SRS location |
|
|
18
|
+
| ------- | ---------- | ------ | ------------ |
|
|
19
|
+
| <Example feature> | `EX` | Draft → SRS in progress | _(this file)_ |
|
|
20
|
+
|
|
21
|
+
> **As-built stubs** are reverse-documented from code, not grilled — requirements describe current
|
|
22
|
+
> behavior at low confidence and carry no test cases yet. Deepen a stub to the full chain
|
|
23
|
+
> (acceptance criteria + Test Cases + Traceability) when its module is next touched.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Non-functional requirements (system-wide)
|
|
28
|
+
|
|
29
|
+
Each NFR is tagged **[verified]** (confirmed against the code as-built) or **[target]** (the
|
|
30
|
+
intended rule, not yet fully enforced — gap noted). Don't promote a target to verified without
|
|
31
|
+
checking the code.
|
|
32
|
+
|
|
33
|
+
| ID | Requirement | State |
|
|
34
|
+
| ------------- | ----------- | ----- |
|
|
35
|
+
| `SYS-NFR-001` | <e.g. errors reported via the central error path; no console.* for errors> | **[target]** |
|
|
36
|
+
|
|
37
|
+
Append new system-wide NFRs here; never renumber existing ones.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# ADR 0001 — Spec-Driven, ISO/IEC 29110-Aligned, Agent-Readable Documentation
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** {{DATE}}
|
|
5
|
+
- **Deciders:** {{DECIDER}}
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
AI agents (and humans) repeatedly lose context on a codebase: unstructured prompts, specs living
|
|
10
|
+
disconnected from code, and no gate between "idea" and "production code." We want spec-driven
|
|
11
|
+
development — approve a blueprint before code — with a recognized standard behind it. As a small
|
|
12
|
+
team (VSE), **ISO/IEC 29110** (Basic Profile, Software Implementation process) fits exactly.
|
|
13
|
+
|
|
14
|
+
## Decision
|
|
15
|
+
|
|
16
|
+
Adopt a repo-resident `docs/` system as the single source of truth:
|
|
17
|
+
|
|
18
|
+
- Authoritative work products in `docs/` (PR-reviewed alongside code).
|
|
19
|
+
- ISO 29110 SI work products only: SRS, Architecture, Traceability, Test Cases. PM work products
|
|
20
|
+
stay in the issue tracker / project tools.
|
|
21
|
+
- Master-then-split organization; feature-prefixed append-only IDs (`PAY-REQ-001`).
|
|
22
|
+
- Three sequential approval gates (SRS → Design + Test Plan → Code).
|
|
23
|
+
- Enforcement by convention: Definition of Ready / Definition of Done in `AGENTS.md`, with the PR
|
|
24
|
+
template checklist as the merge gate. No hooks initially.
|
|
25
|
+
- Behavior-change rule decides when a change must update docs.
|
|
26
|
+
- Reverse-documentation: every existing module gets an **as-built stub** (requirements only, low
|
|
27
|
+
confidence, no test cases), deepened to the full chain when the module is next touched.
|
|
28
|
+
|
|
29
|
+
## Consequences
|
|
30
|
+
|
|
31
|
+
**Positive:** Specs and code never drift (same PR); agents have a deterministic read-before
|
|
32
|
+
target; traceability satisfies the standard; predictable, low-hallucination changes.
|
|
33
|
+
|
|
34
|
+
**Negative / trade-offs considered:**
|
|
35
|
+
|
|
36
|
+
- Convention over hooks → relies on discipline + PR checklist (chosen for flexibility; hooks
|
|
37
|
+
remain a later backstop).
|
|
38
|
+
- Per-feature deep docs are lazy → the as-is system is only shallowly mapped until touched
|
|
39
|
+
(accepted to avoid documenting frozen code).
|
|
40
|
+
|
|
41
|
+
## Alternatives rejected
|
|
42
|
+
|
|
43
|
+
- Specs living outside the repo (drift from code, invisible in PRs).
|
|
44
|
+
- Full deep reverse-scan of all modules up front (weeks documenting stable code).
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# ADR NNNN — <Short title of the decision>
|
|
2
|
+
|
|
3
|
+
- **Status:** Proposed | Accepted | Superseded by ADR-XXXX
|
|
4
|
+
- **Date:** YYYY-MM-DD
|
|
5
|
+
- **Deciders:** <names>
|
|
6
|
+
|
|
7
|
+
> Only write an ADR when **all three** hold: (1) hard to reverse, (2) surprising without context,
|
|
8
|
+
> (3) the result of a real trade-off with genuine alternatives. Otherwise skip it.
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
<!-- The forces at play: what problem, what constraints, what made this a real decision. -->
|
|
13
|
+
|
|
14
|
+
## Decision
|
|
15
|
+
|
|
16
|
+
<!-- What we chose, stated plainly. -->
|
|
17
|
+
|
|
18
|
+
## Consequences
|
|
19
|
+
|
|
20
|
+
**Positive:** …
|
|
21
|
+
|
|
22
|
+
**Negative / trade-offs considered:** …
|
|
23
|
+
|
|
24
|
+
## Alternatives rejected
|
|
25
|
+
|
|
26
|
+
- <Alternative> — <why not>.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Domain Docs
|
|
2
|
+
|
|
3
|
+
How the engineering skills should consume this repo's domain documentation when exploring the
|
|
4
|
+
codebase.
|
|
5
|
+
|
|
6
|
+
This repo is **single-context**: one `CONTEXT.md` + `docs/adr/` at the root.
|
|
7
|
+
|
|
8
|
+
## Before exploring, read these
|
|
9
|
+
|
|
10
|
+
- **`CONTEXT.md`** at the repo root — the ubiquitous-language glossary.
|
|
11
|
+
- **`docs/adr/`** — read ADRs that touch the area you're about to work in.
|
|
12
|
+
|
|
13
|
+
> Note: this repo also runs a spec-driven, ISO/IEC 29110-aligned doc system (see `AGENTS.md`). For
|
|
14
|
+
> feature work, also consult `docs/SRS.md`, `docs/architecture.md`, and the relevant
|
|
15
|
+
> `docs/features/<name>.md` per the protocol in `AGENTS.md`.
|
|
16
|
+
|
|
17
|
+
If any of these files don't exist, **proceed silently**. Don't flag their absence; don't suggest
|
|
18
|
+
creating them upfront. The producer skill (`/grill-with-docs`) creates them lazily when terms or
|
|
19
|
+
decisions actually get resolved.
|
|
20
|
+
|
|
21
|
+
## File structure
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
/
|
|
25
|
+
├── CONTEXT.md
|
|
26
|
+
├── docs/adr/
|
|
27
|
+
│ └── 0001-spec-driven-iso29110-docs.md
|
|
28
|
+
└── apps/, packages/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Use the glossary's vocabulary
|
|
32
|
+
|
|
33
|
+
When your output names a domain concept (an issue title, a refactor proposal, a hypothesis, a test
|
|
34
|
+
name), use the term as defined in `CONTEXT.md`. Don't drift to synonyms the glossary avoids.
|
|
35
|
+
|
|
36
|
+
If the concept you need isn't in the glossary yet, that's a signal — either you're inventing
|
|
37
|
+
language the project doesn't use (reconsider) or there's a real gap (note it for `/grill-with-docs`).
|
|
38
|
+
|
|
39
|
+
## Flag ADR conflicts
|
|
40
|
+
|
|
41
|
+
If your output contradicts an existing ADR, surface it explicitly rather than silently overriding:
|
|
42
|
+
|
|
43
|
+
> _Contradicts ADR-0001 (spec-driven ISO 29110 docs) — but worth reopening because…_
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Issue tracker: GitHub
|
|
2
|
+
|
|
3
|
+
Issues and PRDs for this repo live as GitHub issues. Use the `gh` CLI for all operations.
|
|
4
|
+
|
|
5
|
+
## Conventions
|
|
6
|
+
|
|
7
|
+
- **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies.
|
|
8
|
+
- **Read an issue**: `gh issue view <number> --comments`.
|
|
9
|
+
- **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters.
|
|
10
|
+
- **Comment on an issue**: `gh issue comment <number> --body "..."`
|
|
11
|
+
- **Apply / remove labels**: `gh issue edit <number> --add-label "..."` / `--remove-label "..."`
|
|
12
|
+
- **Close**: `gh issue close <number> --comment "..."`
|
|
13
|
+
|
|
14
|
+
Infer the repo from `git remote -v` — `gh` does this automatically when run inside a clone.
|
|
15
|
+
|
|
16
|
+
## When a skill says "publish to the issue tracker"
|
|
17
|
+
|
|
18
|
+
Create a GitHub issue.
|
|
19
|
+
|
|
20
|
+
## When a skill says "fetch the relevant ticket"
|
|
21
|
+
|
|
22
|
+
Run `gh issue view <number> --comments`.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Triage Labels
|
|
2
|
+
|
|
3
|
+
The skills speak in terms of five canonical triage roles. This file maps those roles to the actual
|
|
4
|
+
label strings used in this repo's issue tracker.
|
|
5
|
+
|
|
6
|
+
| Canonical role | Label in our tracker | Meaning |
|
|
7
|
+
| ----------------- | -------------------- | ---------------------------------------- |
|
|
8
|
+
| `needs-triage` | `needs-triage` | Maintainer needs to evaluate this issue |
|
|
9
|
+
| `needs-info` | `needs-info` | Waiting on reporter for more information |
|
|
10
|
+
| `ready-for-agent` | `ready-for-agent` | Fully specified, ready for an AFK agent |
|
|
11
|
+
| `ready-for-human` | `ready-for-human` | Requires human implementation |
|
|
12
|
+
| `wontfix` | `wontfix` | Will not be actioned |
|
|
13
|
+
|
|
14
|
+
When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label
|
|
15
|
+
string from this table. Edit the right-hand column to match whatever vocabulary you actually use.
|
|
16
|
+
|
|
17
|
+
## Label provisioning
|
|
18
|
+
|
|
19
|
+
Create the labels on first use:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
gh label create needs-triage --description "Maintainer needs to evaluate" --color FBCA04
|
|
23
|
+
gh label create needs-info --description "Waiting on reporter" --color D4C5F9
|
|
24
|
+
gh label create ready-for-agent --description "Fully specified, AFK-ready" --color 0E8A16
|
|
25
|
+
gh label create ready-for-human --description "Needs human implementation" --color 1D76DB
|
|
26
|
+
gh label create wontfix --description "Will not be actioned" --color CCCCCC
|
|
27
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Software Architecture — {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
ISO/IEC 29110 Software Design work product (system level). This is the **as-is map** of the
|
|
4
|
+
shipped system: module boundaries, data model, and integration points. Per-feature design detail
|
|
5
|
+
lives in the `## Design` section of `docs/features/<name>.md`. Decisions with lasting consequences
|
|
6
|
+
are recorded as ADRs in `docs/adr/`.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## System context
|
|
11
|
+
|
|
12
|
+
<!-- One paragraph: runtime, apps, datastore, external integrations. Then a context diagram. -->
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
<Actor> ─→ <Frontend> ─→ <API> ─→ <Database>
|
|
16
|
+
├─→ <Integration A>
|
|
17
|
+
└─→ <Integration B>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Module map
|
|
21
|
+
|
|
22
|
+
| Module | Prefix / location | Responsibility |
|
|
23
|
+
| ------ | ----------------- | -------------- |
|
|
24
|
+
| `<module>` | `/<route>` | … |
|
|
25
|
+
|
|
26
|
+
## Module conventions
|
|
27
|
+
|
|
28
|
+
<!-- The shape every module follows. C9N API default: models/ (Zod namespaces) ·
|
|
29
|
+
use-cases/ (abstract static classes, execute() as a table of contents) ·
|
|
30
|
+
services/ (external integrations) · barrel exports · index.ts (routes).
|
|
31
|
+
See AGENTS.md for the full pattern. -->
|
|
32
|
+
|
|
33
|
+
## Data model (key relationships)
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
<Entity A> → <Entity B> (1:N)
|
|
37
|
+
…
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Integration boundaries
|
|
41
|
+
|
|
42
|
+
| Integration | Direction | Notes |
|
|
43
|
+
| ----------- | --------- | ----- |
|
|
44
|
+
| <Service> | out / in | … |
|
|
45
|
+
|
|
46
|
+
## Per-feature design
|
|
47
|
+
|
|
48
|
+
Per-feature design lives in the `## Design` section of each `docs/features/<name>.md`. The
|
|
49
|
+
complete, authoritative list of features (with short-codes and links) is the registry in
|
|
50
|
+
[`SRS.md`](SRS.md) — not duplicated here.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# <Feature Name> (`<SHORT-CODE>`)
|
|
2
|
+
|
|
3
|
+
> Per-feature deep doc. Short-code is the feature ID and prefixes every child ID
|
|
4
|
+
> (`<SHORT-CODE>-REQ-001`, `<SHORT-CODE>-TC-001`) — append-only, never renumber. Register the
|
|
5
|
+
> feature + short-code in [`../SRS.md`](../SRS.md). See [`../../AGENTS.md`](../../AGENTS.md) for
|
|
6
|
+
> the protocol and approval gates.
|
|
7
|
+
|
|
8
|
+
## 1. Requirements
|
|
9
|
+
|
|
10
|
+
<!-- The _what_. Acceptance-criteria-grade once Gate 1 is approved. -->
|
|
11
|
+
|
|
12
|
+
| ID | Requirement | Acceptance criteria |
|
|
13
|
+
| ------------------- | ----------- | ------------------- |
|
|
14
|
+
| `<SHORT-CODE>-REQ-001` | … | … |
|
|
15
|
+
|
|
16
|
+
## 2. Design
|
|
17
|
+
|
|
18
|
+
<!-- The _how_ (software design). Module(s), data flow, key decisions. Link ADRs if any. -->
|
|
19
|
+
|
|
20
|
+
## 3. Test Plan
|
|
21
|
+
|
|
22
|
+
<!-- How we prove it: levels, scope, what's unit vs integration vs E2E. -->
|
|
23
|
+
|
|
24
|
+
## 4. Test Cases
|
|
25
|
+
|
|
26
|
+
| ID | Scenario | Input | Expected | Traces to |
|
|
27
|
+
| ------------------ | -------- | ----- | -------- | --------- |
|
|
28
|
+
| `<SHORT-CODE>-TC-001` | … | … | … | `<SHORT-CODE>-REQ-001` |
|
|
29
|
+
|
|
30
|
+
## 5. Traceability
|
|
31
|
+
|
|
32
|
+
| Requirement | Design element | Test cases |
|
|
33
|
+
| ------------------- | -------------- | ---------- |
|
|
34
|
+
| `<SHORT-CODE>-REQ-001` | § 2 <section> | `<SHORT-CODE>-TC-001` |
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Test Plan — Master Strategy
|
|
2
|
+
|
|
3
|
+
ISO/IEC 29110 Test Cases & Procedures work product (system level). Defines how the system is
|
|
4
|
+
proven. Per-feature cases live in the `## Test Cases` section of `docs/features/<name>.md`.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Test levels
|
|
9
|
+
|
|
10
|
+
| Level | Scope | Where |
|
|
11
|
+
| ------------ | ------------------------------------- | ------------------- |
|
|
12
|
+
| Unit | Use cases / services in isolation | <app> test suite |
|
|
13
|
+
| Integration | Route → use case → DB, external mocks | <app> test suite |
|
|
14
|
+
| Manual / E2E | End-to-end user flows | Documented per feature |
|
|
15
|
+
|
|
16
|
+
## Conventions
|
|
17
|
+
|
|
18
|
+
- Test case IDs: `<FEATURE>-TC-NNN`, append-only (see [`AGENTS.md`](../AGENTS.md)).
|
|
19
|
+
- Each test case names: scenario, input, expected, and the requirement it traces to.
|
|
20
|
+
- A bug fix toward spec adds a **regression** test case rather than editing the SRS.
|
|
21
|
+
|
|
22
|
+
## Per-feature plans
|
|
23
|
+
|
|
24
|
+
> **Characterization baselines.** As-built modules carry 🧪 _characterization_ cases — derived
|
|
25
|
+
> from the code to lock in **current behavior** for regression, not grilled specs. Promote a
|
|
26
|
+
> module to a grilled spec (acceptance criteria) when it is next deliberately changed.
|
|
27
|
+
|
|
28
|
+
| Feature | Plan | Cases |
|
|
29
|
+
| --------- | ----------------------------------------------- | ---------------------------------------------- |
|
|
30
|
+
| <Example> | [`features/<name>.md § 3`](features/<name>.md#3-test-plan) | [`§ 4`](features/<name>.md#4-test-cases) |
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Traceability Record — Master Index
|
|
2
|
+
|
|
3
|
+
ISO/IEC 29110 Traceability Record. Bidirectional links from each requirement to its design element
|
|
4
|
+
and test cases. Per-feature matrices live in the `## Traceability` section of
|
|
5
|
+
`docs/features/<name>.md`; this file indexes them and holds system-wide links.
|
|
6
|
+
|
|
7
|
+
Every behavior-changing requirement MUST appear here with at least one test case.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Per-feature traceability
|
|
12
|
+
|
|
13
|
+
| Feature | Matrix |
|
|
14
|
+
| ------- | ------ |
|
|
15
|
+
| <Example> | [`features/<name>.md § 5`](features/<name>.md#5-traceability) |
|
|
16
|
+
|
|
17
|
+
> 🧪 = **characterization baseline** (cases lock current behavior). Promote to a grilled spec when
|
|
18
|
+
> the module is next deliberately changed.
|
|
19
|
+
|
|
20
|
+
## How to read a matrix
|
|
21
|
+
|
|
22
|
+
| Requirement | Design element | Test cases |
|
|
23
|
+
| ------------- | -------------------------- | -------------------------- |
|
|
24
|
+
| `EX-REQ-001` | `<name>.md § 2 <section>` | `EX-TC-001`, `EX-TC-002` |
|
|
25
|
+
|
|
26
|
+
- **Forward:** requirement → which design implements it → which tests prove it.
|
|
27
|
+
- **Backward:** a failing `EX-TC-006` → the requirement it guards (`EX-REQ-003`).
|