Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 66 additions & 60 deletions packages/agents/content/skills/_data/work-types.json
Original file line number Diff line number Diff line change
@@ -1,127 +1,133 @@
{
"version": "1.0.0",
"markers": {
"breaking": {
"emoji": "🚨",
"label": "Breaking"
}
},
"tiers": ["public", "internal", "process"],
"types": [
{
"key": "feat",
"aliases": ["feature"],
"tier": "public",
"breakingPolicy": "optional",
"emoji": "πŸŽ‰",
"key": "feat",
"label": "Features",
"breakingPolicy": "optional"
"tier": "public"
},
{
"key": "drop",
"aliases": [],
"tier": "public",
"emoji": "πŸ—‘οΈ",
"label": "Removals",
"breakingPolicy": "required"
"breakingPolicy": "required",
"emoji": "πŸͺ¦",
"key": "drop",
"label": "Removed",
"tier": "public"
},
{
"key": "deprecate",
"aliases": [],
"tier": "public",
"emoji": "⚠️",
"label": "Deprecations",
"breakingPolicy": "forbidden"
"breakingPolicy": "forbidden",
"emoji": "πŸ—‘οΈ",
"key": "deprecate",
"label": "Deprecated",
"tier": "public"
},
{
"key": "fix",
"aliases": ["bugfix"],
"tier": "public",
"breakingPolicy": "forbidden",
"emoji": "πŸ›",
"label": "Fixes",
"breakingPolicy": "forbidden"
"key": "fix",
"label": "Bug fixes",
"tier": "public"
},
{
"key": "sec",
"aliases": ["security"],
"tier": "public",
"breakingPolicy": "optional",
"emoji": "πŸ”’",
"key": "sec",
"label": "Security",
"breakingPolicy": "optional"
"tier": "public"
},
{
"key": "perf",
"aliases": ["performance"],
"tier": "public",
"breakingPolicy": "forbidden",
"emoji": "⚑",
"key": "perf",
"label": "Performance",
"breakingPolicy": "forbidden"
"tier": "public"
},
{
"key": "internal",
"aliases": ["utility"],
"tier": "internal",
"emoji": "πŸ”§",
"label": "Internal functionality",
"breakingPolicy": "forbidden"
"breakingPolicy": "forbidden",
"emoji": "πŸ—οΈ",
"key": "internal",
"label": "Internal features",
"tier": "internal"
},
{
"key": "refactor",
"aliases": [],
"tier": "internal",
"breakingPolicy": "forbidden",
"emoji": "♻️",
"key": "refactor",
"label": "Refactoring",
"breakingPolicy": "forbidden"
"tier": "internal"
},
{
"key": "tests",
"aliases": ["test"],
"tier": "internal",
"breakingPolicy": "forbidden",
"emoji": "πŸ§ͺ",
"key": "tests",
"label": "Tests",
"breakingPolicy": "forbidden"
"tier": "internal"
},
{
"key": "tooling",
"aliases": [],
"tier": "process",
"emoji": "πŸ› οΈ",
"breakingPolicy": "forbidden",
"emoji": "βš™οΈ",
"key": "tooling",
"label": "Tooling",
"breakingPolicy": "forbidden"
"tier": "process"
},
{
"key": "ci",
"aliases": [],
"tier": "process",
"emoji": "πŸ€–",
"breakingPolicy": "forbidden",
"emoji": "πŸ‘·",
"key": "ci",
"label": "CI",
"breakingPolicy": "forbidden"
"tier": "process"
},
{
"key": "deps",
"aliases": ["dep"],
"tier": "process",
"breakingPolicy": "forbidden",
"emoji": "πŸ“¦",
"key": "deps",
"label": "Dependencies",
"breakingPolicy": "forbidden"
"tier": "process"
},
{
"key": "ai",
"aliases": [],
"tier": "process",
"emoji": "🧠",
"label": "AI",
"breakingPolicy": "forbidden"
"breakingPolicy": "forbidden",
"emoji": "πŸ€–",
"key": "ai",
"label": "Agentic support",
"tier": "process"
},
{
"key": "docs",
"aliases": ["doc"],
"tier": "process",
"breakingPolicy": "forbidden",
"emoji": "πŸ“š",
"key": "docs",
"label": "Documentation",
"breakingPolicy": "forbidden"
"tier": "process"
},
{
"key": "fmt",
"aliases": [],
"tier": "process",
"emoji": "πŸ’…",
"label": "Formatting",
"breakingPolicy": "forbidden",
"excludedFromChangelog": true
"emoji": "🎨",
"excludedFromChangelog": true,
"key": "fmt",
"label": "Formatting",
"tier": "process"
}
]
],
"version": "1.0.0"
}
14 changes: 8 additions & 6 deletions packages/agents/content/skills/summarize-change/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,23 +61,23 @@ Good: "Heavy-upload sessions were intermittently failing as users hit the upstre

## Details

### Features
### πŸŽ‰ Features

{Only if applicable}

### Fixes
### πŸ› Bug fixes

{Only if applicable}

### Refactoring
### ♻️ Refactoring

{Only if applicable}

### Tests
### πŸ§ͺ Tests

{Only if applicable}

### Dependencies
### πŸ“¦ Dependencies

{Only if applicable}
```
Expand All @@ -88,7 +88,9 @@ Good: "Heavy-upload sessions were intermittently failing as users hit the upstre
- The change summary follows **newspaper style** β€” progressive disclosure from most to least essential: `## What` is the headline (outcome in plain language), `## Why` is the context (motivation and background), `## Details` is the full story (implementation mechanics)
- Ignore auto-formatter and lint-fix changes
- Omit inapplicable Details subsections
- Order Details subsections per `work-types.json` tier order: public β†’ internal β†’ process
- Subsection headings use `{emoji} {label}` from the matching [work-types.json](../_data/work-types.json) `types[]` entry. For any subsection not enumerated in the example template above, look up the entry by work-type key and use its `emoji` and `label`.
- Order Details subsections per `work-types.json` tier order: public β†’ internal β†’ process.
- Prefix any individual `## Details` entry that describes a breaking change with `🚨 **Breaking:** ` (drawn from `markers.breaking` in [work-types.json](../_data/work-types.json), rendered as `{emoji} **{label}:** `). Trigger conditions: a commit with the `!` breaking marker (e.g., `feat!`) or a `BREAKING CHANGE:` footer. The entry stays under its work-type subsection β€” the prefix tags it inline rather than relocating it to a separate section.
- `## What` and `## Why` are required; Details subsections are optional
- Never list automated checks (formatting, linting, typechecking, unit tests) in a test plan. They run automatically in CI.

Expand Down
118 changes: 72 additions & 46 deletions packages/agents/schemas/work-types.schema.json
Original file line number Diff line number Diff line change
@@ -1,77 +1,103 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/williamthorsen/codeassembly/raw/agents-v0.1.0/packages/agents/schemas/work-types.schema.json",
"title": "Work types",
"description": "Canonical work-types taxonomy consumed by skill content and downstream changelog/release-notes tooling. Defines the work-type vocabulary, tier grouping, breaking-change policy, and changelog-eligibility flags.",
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"required": ["version", "tiers", "types"],
"description": "Canonical work-types taxonomy consumed by skill content and downstream changelog/release-notes tooling. Defines the work-type vocabulary, tier grouping, breaking-change policy, changelog-eligibility flags, and cross-cutting section markers (e.g., the breaking-changes indicator).",
"properties": {
"version": {
"type": "string",
"description": "Semantic version of the data shape. Bump when the structure changes in a way that breaks downstream consumers.",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
"markers": {
"additionalProperties": false,
"description": "Cross-cutting section markers used in PR descriptions and release-notes rendering. Orthogonal to `types[]` β€” these are not work types but visual indicators applied inline to individual entries within their work-type subsection. Add new markers as sibling keys under `markers`; each follows the same `{emoji, label}` shape.",
"properties": {
"breaking": {
"additionalProperties": false,
"description": "Marker for breaking-change entries. Consumed by `summarize-change` as an inline prefix (`{emoji} **{label}:**`, e.g., `🚨 **Breaking:**`) on individual `## Details` entries that describe a breaking change; the entry stays under its work-type subsection.",
"properties": {
"emoji": {
"description": "Glyph rendered at the start of the inline breaking-change prefix.",
"minLength": 1,
"type": "string"
},
"label": {
"description": "Bare tag word rendered inside the inline prefix's bold construction (e.g., `**Breaking:**`). Singular β€” punctuation belongs to the rendering template.",
"minLength": 1,
"type": "string"
}
},
"required": ["emoji", "label"],
"type": "object"
}
},
"required": ["breaking"],
"type": "object"
},
"tiers": {
"type": "array",
"description": "Canonical tier vocabulary in precedence order (higher tier wins ties). Mirrored at `types[].tier`. Each position is pinned via `prefixItems` so that order is enforced structurally.",
"items": false,
"maxItems": 3,
"minItems": 3,
"prefixItems": [
{ "type": "string", "const": "public" },
{ "type": "string", "const": "internal" },
{ "type": "string", "const": "process" }
{ "const": "public", "type": "string" },
{ "const": "internal", "type": "string" },
{ "const": "process", "type": "string" }
],
"minItems": 3,
"maxItems": 3,
"items": false
"type": "array"
},
"types": {
"type": "array",
"description": "The work-type records, in canonical render order. Order is meaningful: when ranking applicable types within a tier, earlier entries win.",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["key", "aliases", "tier", "emoji", "label", "breakingPolicy"],
"properties": {
"key": {
"type": "string",
"description": "Canonical short identifier used in commit messages (e.g., `feat`, `fix`).",
"pattern": "^[a-z][a-z0-9-]*$"
},
"aliases": {
"type": "array",
"description": "Alternative identifiers that resolve to the same `key`. Globally unique across all types (asserted in test).",
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]*$"
"pattern": "^[a-z][a-z0-9-]*$",
"type": "string"
},
"type": "array",
"uniqueItems": true
},
"tier": {
"type": "string",
"description": "Which tier this type belongs to. Drives precedence and grouping in skill content.",
"enum": ["public", "internal", "process"]
"breakingPolicy": {
"description": "Whether a breaking-change marker (`!`) is forbidden, optional, or required for this type.",
"enum": ["forbidden", "optional", "required"],
"type": "string"
},
"emoji": {
"type": "string",
"description": "Single-character (or short) emoji used in section headers and changelog rendering.",
"minLength": 1
"minLength": 1,
"type": "string"
},
"excludedFromChangelog": {
"description": "When true, commits of this type are omitted from the generated changelog (e.g., `fmt`).",
"type": "boolean"
},
"key": {
"description": "Canonical short identifier used in commit messages (e.g., `feat`, `fix`).",
"pattern": "^[a-z][a-z0-9-]*$",
"type": "string"
},
"label": {
"type": "string",
"description": "Human-readable category label used in section headings (e.g., `Features`, `Fixes`).",
"minLength": 1
},
"breakingPolicy": {
"type": "string",
"description": "Whether a breaking-change marker (`!`) is forbidden, optional, or required for this type.",
"enum": ["forbidden", "optional", "required"]
"minLength": 1,
"type": "string"
},
"excludedFromChangelog": {
"type": "boolean",
"description": "When true, commits of this type are omitted from the generated changelog (e.g., `fmt`)."
"tier": {
"description": "Which tier this type belongs to. Drives precedence and grouping in skill content.",
"enum": ["public", "internal", "process"],
"type": "string"
}
}
}
},
"required": ["aliases", "breakingPolicy", "emoji", "key", "label", "tier"],
"type": "object"
},
"type": "array"
},
"version": {
"description": "Semantic version of the data shape. Bump when the structure changes in a way that breaks downstream consumers.",
"pattern": "^\\d+\\.\\d+\\.\\d+$",
"type": "string"
}
}
},
"required": ["markers", "tiers", "types", "version"],
"title": "Work types",
"type": "object"
}
Loading
Loading