@amsterdamdatalabs/enact-extensions 0.1.51 → 0.1.54
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/extensions/enact-repo/.agents/plugin.json +1 -1
- package/extensions/enact-repo/skills/to-feature/SKILL.md +2 -2
- package/extensions/enact-repo/skills/to-feature/references/FEATURE-SPEC-TEMPLATE.md +6 -5
- package/extensions/enact-repo/skills/to-workitems/SKILL.md +6 -5
- package/extensions/enact-repo/skills/to-workitems/references/TICKET-TEMPLATES.md +7 -5
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enact-repo",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Baseline agent setup for any repository: the full Enact skill catalog plus guard, briefing, and code-review-graph hooks and MCP tooling, installed at repo scope.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "amsterdamdatalabs"
|
|
@@ -8,7 +8,7 @@ disable-model-invocation: true
|
|
|
8
8
|
|
|
9
9
|
Open a **Feature** on the board and give it a plan folder to live in.
|
|
10
10
|
|
|
11
|
-
**A plan is a Feature, and a Feature is a directory** — `features/az<id>-<slug>/spec.md`, named for the work item it is. This skill creates that Feature and that directory; `to-workitems` later fills its `items/` with PBIs and Bugs parented under it. Where the repo carries a `plans/AGENTS.md`, it governs; otherwise follow the global `## Plans and work items` contract in your host's agent instructions.
|
|
11
|
+
**A plan is a Feature, and a Feature is a directory** — `plans/features/az<id>-<slug>/spec.md`, named for the work item it is. This skill creates that Feature and that directory; `to-workitems` later fills its `items/` with PBIs and Bugs parented under it. Where the repo carries a `plans/AGENTS.md`, it governs; otherwise follow the global `## Plans and work items` contract in your host's agent instructions.
|
|
12
12
|
|
|
13
13
|
Do NOT interview the user — synthesize what you already know from the conversation and the codebase.
|
|
14
14
|
|
|
@@ -72,7 +72,7 @@ workitem_create_or_update({
|
|
|
72
72
|
|
|
73
73
|
### 6. Record the id, then verify the link landed
|
|
74
74
|
|
|
75
|
-
Create `features/az<id>-<slug>/` — named with the id the create call just returned, which is the only name it ever has — and write the drafted spec into its `spec.md` with `work_item:` set to that id and `epic:` carried through. Do this **immediately**, before anything else: a crash then leaves a folder that says what exists on the board, rather than a Feature nobody can trace back to a plan.
|
|
75
|
+
Create `plans/features/az<id>-<slug>/` — named with the id the create call just returned, which is the only name it ever has — and write the drafted spec into its `spec.md` with `work_item:` set to that id and `epic:` carried through. Do this **immediately**, before anything else: a crash then leaves a folder that says what exists on the board, rather than a Feature nobody can trace back to a plan.
|
|
76
76
|
|
|
77
77
|
Leave `items/` uncreated. A Feature whose items do not exist yet is the normal resting state of a fresh plan, not an unfinished one.
|
|
78
78
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# The plan document
|
|
2
2
|
|
|
3
|
-
`features/az<id>-<slug>/spec.md`. **This file IS the Feature** — the long form of its work
|
|
3
|
+
`plans/features/az<id>-<slug>/spec.md`. **This file IS the Feature** — the long form of its work
|
|
4
4
|
item, not a parallel copy. `## Problem` and `## Solution` are its Description; `## Acceptance
|
|
5
5
|
criteria` is its Acceptance Criteria field. If the two ever differ, the board is lying.
|
|
6
6
|
|
|
@@ -52,11 +52,12 @@ Non-goals: [what a reader would wrongly assume is included]
|
|
|
52
52
|
|
|
53
53
|
## Items
|
|
54
54
|
|
|
55
|
-
Order and dependencies.
|
|
55
|
+
Order and dependencies. Each row is the complete source for an item that does not have a file
|
|
56
|
+
until `to-workitems` allocates its id.
|
|
56
57
|
|
|
57
|
-
| # | Item | Work item | Predecessor |
|
|
58
|
-
| --- | --- | --- | --- |
|
|
59
|
-
| 1 |
|
|
58
|
+
| # | Title | Item type | Delivers | Verification | Work item | Predecessor |
|
|
59
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
60
|
+
| 1 | [the outcome this slice delivers] | pbi | [the complete vertical slice] | [a falsifiable check] | | — |
|
|
60
61
|
|
|
61
62
|
## Verification
|
|
62
63
|
|
|
@@ -17,13 +17,13 @@ Put a plan's **backlog items** on the board.
|
|
|
17
17
|
## Do Not Use When
|
|
18
18
|
|
|
19
19
|
- The plan has open decisions under `## Decisions` — resolve them first, or chart the effort with `wayfinder` if the destination itself is still unclear.
|
|
20
|
-
- `epic:` or `
|
|
20
|
+
- `epic:` or `work_item:` is unset. **Stop and ask.** Those are the plan's Epic id and Feature id respectively. Never create an Epic or Feature to fill the gap: a typo must fail here, not silently spawn a duplicate. The server refuses a stray Epic outright, and refuses a wrong-*typed* parent for any creatable type — but a right-typed id can still be the **wrong** one, and nothing on the board catches that. Identity is on you.
|
|
21
21
|
|
|
22
22
|
## Process
|
|
23
23
|
|
|
24
24
|
### 1. Read the plan and check the board
|
|
25
25
|
|
|
26
|
-
`workitem_list_or_get({ id: <
|
|
26
|
+
`workitem_list_or_get({ id: <work_item>, raw: true })` and assert:
|
|
27
27
|
|
|
28
28
|
- `fields['System.WorkItemType']` is `Feature`
|
|
29
29
|
- `links.parent` is `epic`
|
|
@@ -65,14 +65,15 @@ In `## Items` order, predecessors first — that is what makes `predecessors` ex
|
|
|
65
65
|
workitem_create_or_update({
|
|
66
66
|
type: <item_type: pbi -> 'Product Backlog Item', bug -> 'Bug'>,
|
|
67
67
|
title: <the item's title>,
|
|
68
|
-
description: <the
|
|
69
|
-
|
|
68
|
+
description: <the row's Delivers plus its source plan and row, per references/TICKET-TEMPLATES.md>,
|
|
69
|
+
acceptanceCriteria: <the row's Verification, verbatim>,
|
|
70
|
+
parentId: <the plan's work_item>,
|
|
70
71
|
predecessors: [<ids of the rows this one lists under Predecessor>],
|
|
71
72
|
related: [<for a Bug: the id of the PBI it was found in>],
|
|
72
73
|
})
|
|
73
74
|
```
|
|
74
75
|
|
|
75
|
-
The
|
|
76
|
+
The row's delivery and source become `description`, shaped by [references/TICKET-TEMPLATES.md](references/TICKET-TEMPLATES.md). Its falsifiable verification becomes `acceptanceCriteria` verbatim. Both are advertised arguments and go on the create call, so the board receives the same fields as the row without a follow-up write.
|
|
76
77
|
|
|
77
78
|
A Bug parents to the **Feature**, exactly as a PBI does, so `related` is the only way to record which item it was found while building.
|
|
78
79
|
|
|
@@ -2,22 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
## The work item's `description`
|
|
4
4
|
|
|
5
|
-
Sent on the create call for every PBI and Bug. It
|
|
5
|
+
Sent on the create call for every PBI and Bug. It carries what the row delivers and where that
|
|
6
|
+
row came from:
|
|
6
7
|
|
|
7
8
|
```markdown
|
|
8
9
|
## What it delivers
|
|
9
10
|
|
|
10
11
|
The end-to-end behaviour this makes work. Not a layer-by-layer list.
|
|
11
12
|
|
|
12
|
-
## Verification
|
|
13
|
-
|
|
14
|
-
The falsifiable check. A command and its expected result, not "tested".
|
|
15
|
-
|
|
16
13
|
## Source
|
|
17
14
|
|
|
18
15
|
Plan: the Feature's `spec.md`, `## Items` row <n>.
|
|
19
16
|
```
|
|
20
17
|
|
|
18
|
+
## The work item's `acceptanceCriteria`
|
|
19
|
+
|
|
20
|
+
The row's `Verification` cell, verbatim: a falsifiable check with its expected result, not
|
|
21
|
+
"tested". Send it as `acceptanceCriteria` on the same create call as `description`.
|
|
22
|
+
|
|
21
23
|
## The item file
|
|
22
24
|
|
|
23
25
|
Written after the create call returns, because the file is named `az<work item id>-<slug>.md`
|