Skip to content

Commit 32e3cfc

Browse files
Merge remote-tracking branch 'upstream/master'
# Conflicts: # src/main/java/org/cyclonedx/gradle/CyclonedxAggregateTask.java # src/main/java/org/cyclonedx/gradle/CyclonedxPlugin.java
2 parents 3631f25 + d4adee9 commit 32e3cfc

40 files changed

Lines changed: 1105 additions & 86 deletions
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# ADR Format
2+
3+
ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc.
4+
5+
Create the `docs/adr/` directory lazily — only when the first ADR is needed.
6+
7+
## Template
8+
9+
```md
10+
# {Short title of the decision}
11+
12+
{1-3 sentences: what's the context, what did we decide, and why.}
13+
```
14+
15+
That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections.
16+
17+
## Optional sections
18+
19+
Only include these when they add genuine value. Most ADRs won't need them.
20+
21+
- **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited
22+
- **Considered Options** — only when the rejected alternatives are worth remembering
23+
- **Consequences** — only when non-obvious downstream effects need to be called out
24+
25+
## Numbering
26+
27+
Scan `docs/adr/` for the highest existing number and increment by one.
28+
29+
## When to offer an ADR
30+
31+
All three of these must be true:
32+
33+
1. **Hard to reverse** — the cost of changing your mind later is meaningful
34+
2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?"
35+
3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons
36+
37+
If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing."
38+
39+
### What qualifies
40+
41+
- **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres."
42+
- **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP."
43+
- **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out.
44+
- **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s.
45+
- **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate.
46+
- **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract."
47+
- **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# CONTEXT.md Format
2+
3+
## Structure
4+
5+
```md
6+
# {Context Name}
7+
8+
{One or two sentence description of what this context is and why it exists.}
9+
10+
## Language
11+
12+
**Order**:
13+
{A one or two sentence description of the term}
14+
_Avoid_: Purchase, transaction
15+
16+
**Invoice**:
17+
A request for payment sent to a customer after delivery.
18+
_Avoid_: Bill, payment request
19+
20+
**Customer**:
21+
A person or organization that places orders.
22+
_Avoid_: Client, buyer, account
23+
```
24+
25+
## Rules
26+
27+
- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others under `_Avoid_`.
28+
- **Keep definitions tight.** One or two sentences max. Define what it IS, not what it does.
29+
- **Only include terms specific to this project's context.** General programming concepts (timeouts, error types, utility patterns) don't belong even if the project uses them extensively. Before adding a term, ask: is this a concept unique to this context, or a general programming concept? Only the former belongs.
30+
- **Group terms under subheadings** when natural clusters emerge. If all terms belong to a single cohesive area, a flat list is fine.
31+
32+
## Single vs multi-context repos
33+
34+
**Single context (most repos):** One `CONTEXT.md` at the repo root.
35+
36+
**Multiple contexts:** A `CONTEXT-MAP.md` at the repo root lists the contexts, where they live, and how they relate to each other:
37+
38+
```md
39+
# Context Map
40+
41+
## Contexts
42+
43+
- [Ordering](./src/ordering/CONTEXT.md) — receives and tracks customer orders
44+
- [Billing](./src/billing/CONTEXT.md) — generates invoices and processes payments
45+
- [Fulfillment](./src/fulfillment/CONTEXT.md) — manages warehouse picking and shipping
46+
47+
## Relationships
48+
49+
- **Ordering → Fulfillment**: Ordering emits `OrderPlaced` events; Fulfillment consumes them to start picking
50+
- **Fulfillment → Billing**: Fulfillment emits `ShipmentDispatched` events; Billing consumes them to generate invoices
51+
- **Ordering ↔ Billing**: Shared types for `CustomerId` and `Money`
52+
```
53+
54+
The skill infers which structure applies:
55+
56+
- If `CONTEXT-MAP.md` exists, read it to find contexts
57+
- If only a root `CONTEXT.md` exists, single context
58+
- If neither exists, create a root `CONTEXT.md` lazily when the first term is resolved
59+
60+
When multiple contexts exist, infer which one the current topic relates to. If unclear, ask.
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
name: domain-modeling
3+
description: Build and sharpen a project's domain model. Use when the user wants to pin down domain terminology or a ubiquitous language, record an architectural decision, or when another skill needs to maintain the domain model.
4+
---
5+
6+
# Domain Modeling
7+
8+
Actively build and sharpen the project's domain model as you design. This is the *active* discipline — challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `CONTEXT.md` for vocabulary is not this skill — that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.)
9+
10+
## File structure
11+
12+
Most repos have a single context:
13+
14+
```
15+
/
16+
├── CONTEXT.md
17+
├── docs/
18+
│ └── adr/
19+
│ ├── 0001-event-sourced-orders.md
20+
│ └── 0002-postgres-for-write-model.md
21+
└── src/
22+
```
23+
24+
If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:
25+
26+
```
27+
/
28+
├── CONTEXT-MAP.md
29+
├── docs/
30+
│ └── adr/ ← system-wide decisions
31+
├── src/
32+
│ ├── ordering/
33+
│ │ ├── CONTEXT.md
34+
│ │ └── docs/adr/ ← context-specific decisions
35+
│ └── billing/
36+
│ ├── CONTEXT.md
37+
│ └── docs/adr/
38+
```
39+
40+
Create files lazily — only when you have something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.
41+
42+
## During the session
43+
44+
### Challenge against the glossary
45+
46+
When the user uses a term that conflicts with the existing language in `CONTEXT.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"
47+
48+
### Sharpen fuzzy language
49+
50+
When the user uses vague or overloaded terms, propose a precise canonical term. "You're saying 'account' — do you mean the Customer or the User? Those are different things."
51+
52+
### Discuss concrete scenarios
53+
54+
When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts.
55+
56+
### Cross-reference with code
57+
58+
When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?"
59+
60+
### Update CONTEXT.md inline
61+
62+
When a term is resolved, update `CONTEXT.md` right there. Don't batch these up — capture them as they happen. Use the format in [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md).
63+
64+
`CONTEXT.md` should be totally devoid of implementation details. Do not treat `CONTEXT.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else.
65+
66+
### Offer ADRs sparingly
67+
68+
Only offer to create an ADR when all three are true:
69+
70+
1. **Hard to reverse** — the cost of changing your mind later is meaningful
71+
2. **Surprising without context** — a future reader will wonder "why did they do it this way?"
72+
3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons
73+
74+
If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](./ADR-FORMAT.md).
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface:
2+
display_name: "Domain Modeling"
3+
short_description: "Build and sharpen a domain model"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
name: grill-with-docs
3+
description: A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.
4+
disable-model-invocation: true
5+
---
6+
7+
Run a `/grilling` session, using the `/domain-modeling` skill.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
interface:
2+
display_name: "Grill with Docs"
3+
short_description: "Grill a design and write its docs"
4+
policy:
5+
allow_implicit_invocation: false

.agents/skills/grilling/SKILL.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
name: grilling
3+
description: Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.
4+
---
5+
6+
Interview me relentlessly about every aspect of this until we reach a shared understanding. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
7+
8+
Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
9+
10+
If a *fact* can be found by exploring the environment (filesystem, tools, etc.), look it up rather than asking me. The *decisions*, though, are mine — put each one to me and wait for my answer.
11+
12+
Do not act on it until I confirm we have reached a shared understanding.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface:
2+
display_name: "Grilling"
3+
short_description: "Stress-test thinking one question at a time"
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# ADR Format
2+
3+
ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc.
4+
5+
Create the `docs/adr/` directory lazily — only when the first ADR is needed.
6+
7+
## Template
8+
9+
```md
10+
# {Short title of the decision}
11+
12+
{1-3 sentences: what's the context, what did we decide, and why.}
13+
```
14+
15+
That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections.
16+
17+
## Optional sections
18+
19+
Only include these when they add genuine value. Most ADRs won't need them.
20+
21+
- **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited
22+
- **Considered Options** — only when the rejected alternatives are worth remembering
23+
- **Consequences** — only when non-obvious downstream effects need to be called out
24+
25+
## Numbering
26+
27+
Scan `docs/adr/` for the highest existing number and increment by one.
28+
29+
## When to offer an ADR
30+
31+
All three of these must be true:
32+
33+
1. **Hard to reverse** — the cost of changing your mind later is meaningful
34+
2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?"
35+
3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons
36+
37+
If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing."
38+
39+
### What qualifies
40+
41+
- **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres."
42+
- **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP."
43+
- **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out.
44+
- **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s.
45+
- **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate.
46+
- **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract."
47+
- **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# CONTEXT.md Format
2+
3+
## Structure
4+
5+
```md
6+
# {Context Name}
7+
8+
{One or two sentence description of what this context is and why it exists.}
9+
10+
## Language
11+
12+
**Order**:
13+
{A one or two sentence description of the term}
14+
_Avoid_: Purchase, transaction
15+
16+
**Invoice**:
17+
A request for payment sent to a customer after delivery.
18+
_Avoid_: Bill, payment request
19+
20+
**Customer**:
21+
A person or organization that places orders.
22+
_Avoid_: Client, buyer, account
23+
```
24+
25+
## Rules
26+
27+
- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others under `_Avoid_`.
28+
- **Keep definitions tight.** One or two sentences max. Define what it IS, not what it does.
29+
- **Only include terms specific to this project's context.** General programming concepts (timeouts, error types, utility patterns) don't belong even if the project uses them extensively. Before adding a term, ask: is this a concept unique to this context, or a general programming concept? Only the former belongs.
30+
- **Group terms under subheadings** when natural clusters emerge. If all terms belong to a single cohesive area, a flat list is fine.
31+
32+
## Single vs multi-context repos
33+
34+
**Single context (most repos):** One `CONTEXT.md` at the repo root.
35+
36+
**Multiple contexts:** A `CONTEXT-MAP.md` at the repo root lists the contexts, where they live, and how they relate to each other:
37+
38+
```md
39+
# Context Map
40+
41+
## Contexts
42+
43+
- [Ordering](./src/ordering/CONTEXT.md) — receives and tracks customer orders
44+
- [Billing](./src/billing/CONTEXT.md) — generates invoices and processes payments
45+
- [Fulfillment](./src/fulfillment/CONTEXT.md) — manages warehouse picking and shipping
46+
47+
## Relationships
48+
49+
- **Ordering → Fulfillment**: Ordering emits `OrderPlaced` events; Fulfillment consumes them to start picking
50+
- **Fulfillment → Billing**: Fulfillment emits `ShipmentDispatched` events; Billing consumes them to generate invoices
51+
- **Ordering ↔ Billing**: Shared types for `CustomerId` and `Money`
52+
```
53+
54+
The skill infers which structure applies:
55+
56+
- If `CONTEXT-MAP.md` exists, read it to find contexts
57+
- If only a root `CONTEXT.md` exists, single context
58+
- If neither exists, create a root `CONTEXT.md` lazily when the first term is resolved
59+
60+
When multiple contexts exist, infer which one the current topic relates to. If unclear, ask.

0 commit comments

Comments
 (0)