@jehudarajasa/agency-skills 1.0.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/LICENSE +21 -0
- package/config.example.yml +22 -0
- package/index.js +15 -0
- package/package.json +35 -0
- package/references/issue-tracker.md +27 -0
- package/references/issue-workspace.md +40 -0
- package/skills/commit/SKILL.md +27 -0
- package/skills/commit/agents/openai.yaml +6 -0
- package/skills/cut-branch/SKILL.md +22 -0
- package/skills/cut-branch/agents/openai.yaml +6 -0
- package/skills/fetch-issues/SKILL.md +17 -0
- package/skills/fetch-issues/agents/openai.yaml +6 -0
- package/skills/help-me-understand/SKILL.md +61 -0
- package/skills/help-me-understand/agents/openai.yaml +6 -0
- package/skills/implement-change/SKILL.md +38 -0
- package/skills/implement-change/agents/openai.yaml +6 -0
- package/skills/open-change-request/SKILL.md +26 -0
- package/skills/open-change-request/agents/openai.yaml +6 -0
- package/skills/plan-implementation/SKILL.md +38 -0
- package/skills/plan-implementation/agents/openai.yaml +6 -0
- package/skills/setup-agency-skills/SKILL.md +36 -0
- package/skills/setup-agency-skills/agents/openai.yaml +6 -0
- package/skills/update-plan/SKILL.md +31 -0
- package/skills/update-plan/agents/openai.yaml +6 -0
- package/skills/where-were-we/SKILL.md +36 -0
- package/skills/where-were-we/agents/openai.yaml +6 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jehuda Rajasa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# .agents/config.yml — copy this to your project root and trim to taste.
|
|
2
|
+
# Every field is optional. The skills read `git remote` first and only fall
|
|
3
|
+
# back here for what the environment can't reveal: your team's state names,
|
|
4
|
+
# labels, and branch conventions.
|
|
5
|
+
|
|
6
|
+
# Which tracker and which project. Omit both when your git remote already
|
|
7
|
+
# names them (GitHub / GitLab). Required for Jira, Linear, or a self-hosted
|
|
8
|
+
# host the remote can't identify.
|
|
9
|
+
tracker: gitlab # gitlab | github | jira | linear
|
|
10
|
+
project: group/repo # the tracker's project id or slug
|
|
11
|
+
|
|
12
|
+
# Used by `fetch-issues`: which issue states count as "workable, not done".
|
|
13
|
+
active_states: [Open, "To Do", Staging, WIP]
|
|
14
|
+
|
|
15
|
+
# Used by planning, implementation, and opening a change request:
|
|
16
|
+
# the states the workflow moves an issue into.
|
|
17
|
+
states:
|
|
18
|
+
in_progress: WIP
|
|
19
|
+
review: "In Review"
|
|
20
|
+
|
|
21
|
+
# open-change-request: what your tracker calls the review artifact.
|
|
22
|
+
change_request: MR # MR (GitLab) | PR (GitHub, Bitbucket)
|
package/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
|
|
4
|
+
const skillsPath = path.join(path.dirname(fileURLToPath(import.meta.url)), "skills");
|
|
5
|
+
|
|
6
|
+
export default async () => ({
|
|
7
|
+
config(config) {
|
|
8
|
+
config.skills ??= {};
|
|
9
|
+
config.skills.paths ??= [];
|
|
10
|
+
|
|
11
|
+
if (!config.skills.paths.includes(skillsPath)) {
|
|
12
|
+
config.skills.paths.push(skillsPath);
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jehudarajasa/agency-skills",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Tracker-agnostic skills for issue-driven software development workflows.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"opencode-plugin",
|
|
7
|
+
"opencode",
|
|
8
|
+
"agent-skills",
|
|
9
|
+
"software-development"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"author": {
|
|
13
|
+
"name": "Jehuda Rajasa",
|
|
14
|
+
"email": "jehudarajasa@gmail.com"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/jehudarajasa/skills",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/jehudarajasa/skills.git",
|
|
20
|
+
"directory": "plugins/agency-skills"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"main": "./index.js",
|
|
24
|
+
"exports": "./index.js",
|
|
25
|
+
"files": [
|
|
26
|
+
"index.js",
|
|
27
|
+
"skills/",
|
|
28
|
+
"references/",
|
|
29
|
+
"config.example.yml",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Resolving the tracker
|
|
2
|
+
|
|
3
|
+
Every skill that touches issues or change requests resolves the tracker the same way. Read this before the skill's own steps.
|
|
4
|
+
|
|
5
|
+
## Which tracker, which project
|
|
6
|
+
|
|
7
|
+
Read the environment before opening config:
|
|
8
|
+
|
|
9
|
+
1. `git remote get-url origin` — a `github.com` host means GitHub (use the `gh` CLI or a GitHub MCP); a GitLab host means GitLab (use `glab` or a GitLab MCP).
|
|
10
|
+
2. If the remote does not name the tracker (Jira, Linear, or a self-hosted host you cannot identify) read `tracker` and `project` from `.agents/config.yml` in the project root.
|
|
11
|
+
|
|
12
|
+
## Who "the user" is
|
|
13
|
+
|
|
14
|
+
Resolve the user's identity from the tracker's own authenticated account — GitLab `whoami`, `gh api user`, the Linear or Jira viewer. Carry no name or email in any skill.
|
|
15
|
+
|
|
16
|
+
## Moving an issue's state
|
|
17
|
+
|
|
18
|
+
`plan-implementation` and `implement-change` mark work started with `states.in_progress`; `open-change-request` marks code ready for review with `states.review`. These are the skills that move issues. If the issue already has the target state, leave it there.
|
|
19
|
+
|
|
20
|
+
Move the issue only when `.agents/config.yml` maps the state for that action (`states.in_progress`, `states.review`). When the mapping is absent, leave the board untouched.
|
|
21
|
+
|
|
22
|
+
When the mapping is present:
|
|
23
|
+
|
|
24
|
+
- Set only a state or label that already exists on the board. Read the board's current states first and match the configured value against them.
|
|
25
|
+
- When nothing matches (the value is wrong, or the label was renamed) stop and show the user the states that exist, then ask which to use. Never mint a new label or state.
|
|
26
|
+
- Echo the move before making it: "moving #42 → Dev Review".
|
|
27
|
+
- If the tracker models state as labels, drop the previous workflow label as you add the new one, so the issue never carries two.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# The issue workspace
|
|
2
|
+
|
|
3
|
+
Saved plans and their context live at `.issues/<issue-id>-<slug>/` in the repo root. Planning, re-planning, implementation, and re-orientation use this layout when a workspace exists. Direct implementation needs no workspace.
|
|
4
|
+
|
|
5
|
+
## Where it lives
|
|
6
|
+
|
|
7
|
+
- Name the directory `<issue-id>-<slug>` — the branch `cut-branch` made, with its `<type>/` prefix removed. With no issue in the branch, slug the user's request instead and tell the user.
|
|
8
|
+
- Create the workspace only when saving a plan or its context.
|
|
9
|
+
- To find an existing workspace, use the resolved issue id (the argument, else the current branch, else the issue under discussion) and glob `.issues/<issue-id>-*/`.
|
|
10
|
+
|
|
11
|
+
## PLAN.md
|
|
12
|
+
|
|
13
|
+
The plan you synthesize. Use these sections:
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
# Issue <issue-id> — <short title>
|
|
17
|
+
|
|
18
|
+
**Branch:** <branch-name> **Created:** <YYYY-MM-DD> **Status:** Planned
|
|
19
|
+
|
|
20
|
+
## Acceptance Criteria
|
|
21
|
+
|
|
22
|
+
<Observable conditions that must all hold for this issue to be complete.>
|
|
23
|
+
|
|
24
|
+
## Design (optional)
|
|
25
|
+
|
|
26
|
+
<Include when decisions govern multiple tasks. Record the chosen approach, its rationale, and relevant constraints. Put task-specific details with their task. Omit this section when the tasks convey the approach fully.>
|
|
27
|
+
|
|
28
|
+
## Tasks
|
|
29
|
+
|
|
30
|
+
- [ ] <step 1>
|
|
31
|
+
- [ ] <step 2>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`Status` moves `Planned` → `In Progress` → `Done` as the work proceeds.
|
|
35
|
+
|
|
36
|
+
Record decisions and remaining caveats beside the affected design or task. As answers arrive, replace resolved assumptions with the resulting decisions or acceptance criteria.
|
|
37
|
+
|
|
38
|
+
## CONTEXT.md
|
|
39
|
+
|
|
40
|
+
The raw, accreting context the plan draws on — standup notes, Slack quotes, huddle decisions. Free-form, appended to as new context surfaces. Write it only when context beyond the issue itself exists; skip it when the issue stands on its own.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: commit
|
|
3
|
+
description: Commit the working tree as small Conventional Commits.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Turn the working tree into small, well-formed commits: read what changed, stage one concern at a time by name, and write each message in Conventional Commits form. Review the staged diff before every commit.
|
|
8
|
+
|
|
9
|
+
## Read the tree
|
|
10
|
+
|
|
11
|
+
Run `git status` and `git diff` to see everything uncommitted. A clean tree means nothing to do — say so and stop. Otherwise group the changes by concern, where each distinct purpose is its own commit.
|
|
12
|
+
|
|
13
|
+
## Stage one concern
|
|
14
|
+
|
|
15
|
+
Stage that concern's files by name with `git add <path> …`, not `git add -A` or `git add .`, so unrelated edits and scratch files stay out. Leave the other concerns unstaged for their own commits.
|
|
16
|
+
|
|
17
|
+
## Write the message
|
|
18
|
+
|
|
19
|
+
Conventional Commits: `<type>(<scope>): <subject>`. The type is one of `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, or `revert` — pick the one the change earns. The `(<scope>)` is optional; add it only when it sharpens the subject. Subject in the imperative, ≤50 characters. Add a body, wrapped at 72, only when the diff doesn't explain its own why.
|
|
20
|
+
|
|
21
|
+
Breaking an API? Mark it: `!` before the colon (`feat!:`), or a `BREAKING CHANGE: <what broke>` footer — the mark SemVer and changelog tools read for a major bump.
|
|
22
|
+
|
|
23
|
+
## Commit and loop
|
|
24
|
+
|
|
25
|
+
Review the staged diff one more time, then commit. Changes still uncommitted? Back to **Stage one concern** for the next.
|
|
26
|
+
|
|
27
|
+
Done when the tree is clean and every commit is one logical change in Conventional Commits form.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cut-branch
|
|
3
|
+
description: Cut a git branch for an issue, named from the issue's type and title.
|
|
4
|
+
argument-hint: "[issue-id]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Cut a working branch for one issue and check it out. Git only — planning or implementation marks work started per [`references/issue-tracker.md`](../../references/issue-tracker.md).
|
|
9
|
+
|
|
10
|
+
Resolve the tracker per [`references/issue-tracker.md`](../../references/issue-tracker.md).
|
|
11
|
+
|
|
12
|
+
## Name the branch
|
|
13
|
+
|
|
14
|
+
1. Take the issue from the argument — an id or URL. With no argument, use the issue under discussion. Read its title and type from the tracker.
|
|
15
|
+
2. Pick the conventional type from the issue itself: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, or `chore`. Derive it from the issue's own type field or labels; ask the user only when the issue gives no signal.
|
|
16
|
+
3. Build `<type>/<issue-id>-<slug>`, where `slug` condenses the issue to ≤7 words, lowercased and hyphen-separated, e.g. `feat/42-add-meaning-to-universe`.
|
|
17
|
+
|
|
18
|
+
## Cut it
|
|
19
|
+
|
|
20
|
+
4. `git checkout -b <branch-name>` — it forks from the current branch, so cut from the branch you mean to base the work on.
|
|
21
|
+
|
|
22
|
+
Done when the branch exists and is checked out.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fetch-issues
|
|
3
|
+
description: List your open issues on this project's tracker so you can pick one to work on.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
List every open issue assigned to the user that is still **active** — workable, not yet done. Read-only: list them and stop.
|
|
8
|
+
|
|
9
|
+
Resolve the tracker and the user's identity per [`references/issue-tracker.md`](../../references/issue-tracker.md).
|
|
10
|
+
|
|
11
|
+
## Fetch and filter
|
|
12
|
+
|
|
13
|
+
Fetch the open issues assigned to the user, then keep only the **active** ones. Read the active set from `active_states` in `.agents/config.yml`. When that key is absent, treat every state that is not closed, done, or a QA/verification stage as active.
|
|
14
|
+
|
|
15
|
+
## Show them
|
|
16
|
+
|
|
17
|
+
For each surviving issue print one row: id, title, a one-line summary, and its current state or labels, then stop. Picking an issue and starting on it is `cut-branch`'s job.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: help-me-understand
|
|
3
|
+
description: Explain how a feature, pipeline, workflow, or concept in this codebase actually works.
|
|
4
|
+
argument-hint: "What do you want to understand?"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Explain how something in this codebase works, to someone who has never worked in it. Comprehension is the deliverable — measured by what the user can restate afterwards, not by how much you covered. Answer in chat; write a file only if they ask for one.
|
|
9
|
+
|
|
10
|
+
If the argument names an audience (`for a PM`, `for a non-engineer`), take your vocabulary and depth from it. Otherwise, an engineer new to this codebase.
|
|
11
|
+
|
|
12
|
+
## Trace first
|
|
13
|
+
|
|
14
|
+
Read the real path before writing a word — entry point to exit, in the actual code. Names lie, and so does parametric knowledge of how a thing "usually" works. Done when you can name every **hop** with a `file:line` and say what that hop decides.
|
|
15
|
+
|
|
16
|
+
## Size it
|
|
17
|
+
|
|
18
|
+
Count the hops the user must hold in their head at once.
|
|
19
|
+
|
|
20
|
+
- **One answer** if the mechanism fits in ~200 words plus one snippet, with no forward references.
|
|
21
|
+
- **Rounds** otherwise. The forward reference is the tell: if explaining hop 1 needs "more on that later", it's rounds.
|
|
22
|
+
|
|
23
|
+
## Open with the map
|
|
24
|
+
|
|
25
|
+
Both branches start here, in five lines or fewer: one sentence on what the thing is for, then the whole path as an arrow chain.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
🗺 The universe module: question → normalize → cache lookup → compute → return 42. 5 hops.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
In rounds mode the hop count is a contract — the user knows how far this goes.
|
|
32
|
+
|
|
33
|
+
## One answer
|
|
34
|
+
|
|
35
|
+
Map, the mechanism in your own words, one snippet of the lines that make the decision, and the one thing that would surprise someone reading the code cold. Stop there.
|
|
36
|
+
|
|
37
|
+
## Rounds
|
|
38
|
+
|
|
39
|
+
One hop per round, then wait for the user.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
**Hop 3/5 — Cache lookup**
|
|
43
|
+
|
|
44
|
+
<2–4 sentences: what this hop does, in your own words>
|
|
45
|
+
|
|
46
|
+
<≤10 lines of code — the lines that make the decision, rest elided with `…`>
|
|
47
|
+
|
|
48
|
+
<one line: what breaks if this hop is removed>
|
|
49
|
+
|
|
50
|
+
❓ <checkpoint question>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The code is evidence, not the explanation. If the prose only works with the snippet in front of it, the prose isn't doing its job yet.
|
|
54
|
+
|
|
55
|
+
A checkpoint asks the user to predict or apply — "a repeat question comes straight back from the cache; what happens the first time one is asked?" — an answer only comprehension produces. Wrong or hedged: re-explain that hop from a different angle before moving on. A question back from them means the round landed — answer it, then resume.
|
|
56
|
+
|
|
57
|
+
They say skip, or name a hop: jump there.
|
|
58
|
+
|
|
59
|
+
## Recap
|
|
60
|
+
|
|
61
|
+
After the last hop, the whole thing in eight lines or fewer: the map again, each hop annotated with what it decides. This is the part they keep.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: implement-change
|
|
3
|
+
description: Implement a change from a saved plan or clear issue requirements, verify it, and leave it uncommitted for review.
|
|
4
|
+
argument-hint: "[issue-id]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Implement the change and match how the repo already builds and tests. Stop when the change is built and verified — reviewing the diff and committing are the user's next move, on separate skills.
|
|
9
|
+
|
|
10
|
+
## Locate
|
|
11
|
+
|
|
12
|
+
Take the issue from the argument, else the current branch, else the issue under discussion. Resolve the tracker per [`references/issue-tracker.md`](../../references/issue-tracker.md) and read the issue's title and body alongside the user's context.
|
|
13
|
+
|
|
14
|
+
Look for an existing workspace per [`references/issue-workspace.md`](../../references/issue-workspace.md). Read `PLAN.md` and `CONTEXT.md` when present, then inspect the affected code and its callers.
|
|
15
|
+
|
|
16
|
+
## Choose the path
|
|
17
|
+
|
|
18
|
+
- **Saved plan** → follow its acceptance criteria and open tasks.
|
|
19
|
+
- **No saved plan** → proceed directly when the intended behavior, affected scope, and verification are clear. State those briefly in the conversation; keep this path free of plan and workspace creation.
|
|
20
|
+
|
|
21
|
+
If investigation reveals an unresolved product or design decision, explain the decision and pause dependent implementation. Point the user to `/plan-implementation`, or `/update-plan` when revising an existing plan. Routine implementation details are yours to resolve.
|
|
22
|
+
|
|
23
|
+
## Build
|
|
24
|
+
|
|
25
|
+
Before writing code, move the issue to `states.in_progress` per **Moving an issue's state** in [`references/issue-tracker.md`](../../references/issue-tracker.md). When a plan exists, move its Status to `In Progress`, work its open tasks top to bottom, and check off each as it lands. Otherwise implement against the issue's requirements.
|
|
26
|
+
|
|
27
|
+
Read the repo's test posture first:
|
|
28
|
+
|
|
29
|
+
- **Repo already tests** → drive `/tdd` at the seams.
|
|
30
|
+
- **Repo has no tests** → write code only; don't stand up a test harness it never asked for.
|
|
31
|
+
|
|
32
|
+
Comment like the repo does; where it gives no signal, default to none. Add one only when the WHY resists the code (a constraint, a workaround, a surprise), never to restate code or name the task or issue.
|
|
33
|
+
|
|
34
|
+
## Hand off
|
|
35
|
+
|
|
36
|
+
Verify the change against the plan's acceptance criteria or the issue's requirements: it runs, and its tests (if any) pass. Report what changed, the verification performed, and any remaining limitations. Leave any plan's Status at `In Progress`, write no commit, and open no MR. The user will then review the diff — by hand and/or via `/code-review` — before running `/commit`.
|
|
37
|
+
|
|
38
|
+
Done when the requirements are met, every task in an existing plan is checked off, the change is verified, and it sits uncommitted for the user to review.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: open-change-request
|
|
3
|
+
description: Open a merge/pull request for the current branch and move its issue to review.
|
|
4
|
+
argument-hint: "[issue-id]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Open the change request for the current branch — the merge request or pull request your tracker calls it — then move its issue to the review state so the board shows the code is ready.
|
|
9
|
+
|
|
10
|
+
Resolve the tracker and the user's identity per [`references/issue-tracker.md`](../../references/issue-tracker.md). Read the noun your tracker gives the artifact from `change_request` in `.agents/config.yml` — MR on GitLab, PR on GitHub — and call it that in every message.
|
|
11
|
+
|
|
12
|
+
## Open it
|
|
13
|
+
|
|
14
|
+
1. Find the issue for the current branch. `cut-branch` named the branch `<type>/<issue-id>-<slug>`, so its id lives in the branch name; fall back to the argument, then to the issue under discussion. Push the branch to the remote if it is not there yet.
|
|
15
|
+
2. Open the change request from the current branch against the repo's default branch. Reference the issue with `Refs #<id>` (or your tracker's link form — a reference, not an auto-close keyword). The change request already shows the commits and the full diff, so the body adds only what those can't:
|
|
16
|
+
- Summary — what the change does, and why when that isn't obvious. 1-4 sentences.
|
|
17
|
+
- Config (optional) — new environment variables, feature flags, or config files.
|
|
18
|
+
- Notes (optional) — what the diff and commits don't reveal: a renamed concept, a chosen tradeoff, a subtlety.
|
|
19
|
+
3. Title it `Type: Capitalized description` — the conventional type capitalized, then the issue's own title, e.g. `Feat: Add meaning to the universe module`. Leave the scope out unless the title is unclear without it.
|
|
20
|
+
4. Assign it to the user.
|
|
21
|
+
|
|
22
|
+
## Mark it
|
|
23
|
+
|
|
24
|
+
5. Move the issue to `states.review`, following **Moving an issue's state** in [`references/issue-tracker.md`](../../references/issue-tracker.md).
|
|
25
|
+
|
|
26
|
+
Done when the change request is open against the default branch, assigned to the user, and its issue reads as in review on the tracker.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-implementation
|
|
3
|
+
description: Plan a pulled issue with the user and save the plan locally so any session can resume it.
|
|
4
|
+
argument-hint: "[issue-id] [context]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Turn a pulled issue into a concrete, stepped plan, and save it where the next session can pick it up. Plan only: write no source files until the user confirms or runs `/implement-change`. The plan and context files are the only files you write here.
|
|
9
|
+
|
|
10
|
+
Resolve the tracker per [`references/issue-tracker.md`](../../references/issue-tracker.md).
|
|
11
|
+
|
|
12
|
+
## Gather
|
|
13
|
+
|
|
14
|
+
Take the issue from the argument or the one under discussion, and read its title and body. Picking it up to plan is where work starts, so move it to `states.in_progress` per **Moving an issue's state** in [`references/issue-tracker.md`](../../references/issue-tracker.md). It may be thin, so pull in the out-of-band context the user gives you. The plan is what you synthesize from it.
|
|
15
|
+
|
|
16
|
+
When the issue and that context still leave the work under-decided — a real decision hasn't been made yet, not just a detail to clarify — grill it out with `/grilling` first, then plan.
|
|
17
|
+
|
|
18
|
+
## Discuss
|
|
19
|
+
|
|
20
|
+
Viability first: is this worth doing, and doable as framed? If not, surface that with the user before planning further. If it's really several issues wearing one, break it up with `/to-tickets` before planning.
|
|
21
|
+
|
|
22
|
+
Close the gaps between the issue and a concrete plan. Work these through with the user before writing the plan:
|
|
23
|
+
|
|
24
|
+
- Acceptance criteria — the observable outcomes that mark the issue complete.
|
|
25
|
+
- Architecture and its tradeoffs.
|
|
26
|
+
- Libraries and tools — check the library's official docs for current conventions (using Context7 MCP when available) before proposing one.
|
|
27
|
+
- Blast radius — which parts of the codebase change, and what that ripples into.
|
|
28
|
+
|
|
29
|
+
Resolve uncertainties that could change scope, approach, or correctness using available evidence, then ask the user for remaining decisions. Discussion is complete when each identified uncertainty is resolved or has an explicit verification task before work that depends on it.
|
|
30
|
+
|
|
31
|
+
## Save
|
|
32
|
+
|
|
33
|
+
Store the plan in the issue workspace — the `.issues/<issue-id>-<slug>/` layout, the `PLAN.md` template, and the `CONTEXT.md` companion — per [`references/issue-workspace.md`](../../references/issue-workspace.md).
|
|
34
|
+
|
|
35
|
+
- Write the synthesized plan to `PLAN.md`.
|
|
36
|
+
- When context beyond the issue itself surfaced, capture it in `CONTEXT.md`.
|
|
37
|
+
- Print the path after writing.
|
|
38
|
+
- On later iterations, edit `PLAN.md` in place rather than adding a second copy.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-agency-skills
|
|
3
|
+
description: Configure `.agents/config.yml` — the tracker and workflow states the other agency skills read. Run once per project, before the rest.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Write `.agents/config.yml` so the other agency skills resolve your tracker and move issues into states that actually exist on your board. Run once per project. Re-run to revise: read the existing config first and edit it, rather than starting over.
|
|
8
|
+
|
|
9
|
+
Detect and derive first; ask the user only for what the environment can't reveal. Every state you record must be **detected from the board, never invented**: the runtime skills only set a state that already exists, so a value the board doesn't have silently no-ops.
|
|
10
|
+
|
|
11
|
+
## Resolve the tracker
|
|
12
|
+
|
|
13
|
+
Resolve the tracker and the user's identity per [`references/issue-tracker.md`](../../references/issue-tracker.md). This names the host and confirms you can reach the board.
|
|
14
|
+
|
|
15
|
+
- **Remote names the tracker** (GitHub, GitLab) → leave `tracker` and `project` out of the config; the skills read them from `git remote` every run. Writing them caches a lookup that can go stale.
|
|
16
|
+
- **Remote can't name it** (Jira, Linear, self-hosted) → ask the user for `tracker` and `project`, and write both.
|
|
17
|
+
|
|
18
|
+
## Read the board
|
|
19
|
+
|
|
20
|
+
Fetch the workflow states the board actually uses: the status field's values, or the workflow labels when the tracker models state as labels. This live set is the point of running setup. It's what a static example can't know, and what every state you write must match.
|
|
21
|
+
|
|
22
|
+
## Map the states
|
|
23
|
+
|
|
24
|
+
Fill three keys from the real board states, offering the closest match for each and confirming it with the user:
|
|
25
|
+
|
|
26
|
+
- `states.in_progress`: the state that means **work has started** (e.g. `WIP`, `In Progress`).
|
|
27
|
+
- `states.review`: the state that means **code is ready for review** (e.g. `In Review`, `Dev Review`).
|
|
28
|
+
- `active_states`: the states that count as **workable, not done**. Default to every state that isn't closed, done, or a QA/verification stage, and confirm.
|
|
29
|
+
|
|
30
|
+
When the board has no state matching a key, leave the key out; the skills skip that move rather than guess.
|
|
31
|
+
|
|
32
|
+
Set `change_request` automatically from the tracker: `MR` on GitLab, `PR` on GitHub or Bitbucket.
|
|
33
|
+
|
|
34
|
+
## Write and validate
|
|
35
|
+
|
|
36
|
+
Write `.agents/config.yml` in the project root, following the shape of [`config.example.yml`](../../config.example.yml). Keep only the keys this project needs. Omit `tracker` and `project` when the remote resolves them. Print the path.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-plan
|
|
3
|
+
description: Re-synthesize a saved plan after new context arrived, keeping completed work intact.
|
|
4
|
+
argument-hint: "[issue-id] [context]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Fold new context into a plan that already exists — re-synthesize `PLAN.md`, show the user the delta, and leave finished work finished. Plan only: write no source files.
|
|
9
|
+
|
|
10
|
+
## Locate
|
|
11
|
+
|
|
12
|
+
Find the issue workspace per [`references/issue-workspace.md`](../../references/issue-workspace.md), then read its `PLAN.md` and `CONTEXT.md`. You are revising them, not starting over. No workspace for this issue means it was never planned; send the user to `/plan-implementation`.
|
|
13
|
+
|
|
14
|
+
## Gather
|
|
15
|
+
|
|
16
|
+
Append the new context, from the argument or the conversation, to `CONTEXT.md`. Create it if the first plan skipped it.
|
|
17
|
+
|
|
18
|
+
When the new context leaves a real decision open — not just a detail — grill it out with `/grilling` before re-synthesizing.
|
|
19
|
+
|
|
20
|
+
## Re-synthesize
|
|
21
|
+
|
|
22
|
+
Rebuild `PLAN.md` from the issue plus the grown `CONTEXT.md`, using the issue workspace template and recording rules. Two things hold fixed:
|
|
23
|
+
|
|
24
|
+
- **Completed tasks stay done.** A `[x]` task keeps its check unless the new context explicitly undoes it.
|
|
25
|
+
- **Status stays where it was** (`Planned` / `In Progress`), unless the new context moves it.
|
|
26
|
+
|
|
27
|
+
## Confirm and save
|
|
28
|
+
|
|
29
|
+
Before writing, show the user the delta — the sections that moved and why the new context drove each. On their confirmation, write the revised plan to `PLAN.md` in place; never add a second copy. Print the path.
|
|
30
|
+
|
|
31
|
+
Done when `PLAN.md` reflects the new context, completed tasks are intact, the user has confirmed the delta, and no source file was touched.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: where-were-we
|
|
3
|
+
description: Re-orient on an in-flight issue from its requirements, Git history, and any saved plan, and name the next command.
|
|
4
|
+
argument-hint: "[issue-id]"
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Reconstruct where an issue's work stands after time away, and name the one command that moves it forward.
|
|
9
|
+
Read-only: gather the state and report it, change nothing.
|
|
10
|
+
|
|
11
|
+
## Locate
|
|
12
|
+
|
|
13
|
+
Resolve the issue from the argument, else the current branch, else the issue under discussion. Look for its workspace per [`references/issue-workspace.md`](../../references/issue-workspace.md) and read `PLAN.md` and `CONTEXT.md` when present. With no saved plan, reconstruct progress from the issue and Git.
|
|
14
|
+
|
|
15
|
+
## Reconstruct
|
|
16
|
+
|
|
17
|
+
Read the trail the pipeline leaves, across three places:
|
|
18
|
+
|
|
19
|
+
- **Plan, when present** — `PLAN.md`'s status, acceptance criteria, and which tasks are checked versus open. `CONTEXT.md` for the decisions behind them.
|
|
20
|
+
- **Git** — the current branch, the commits already on it, and any uncommitted changes (`git status`, `git diff`).
|
|
21
|
+
- **Tracker** — the issue's title, requirements, state, and whether a change request is already open, per [`references/issue-tracker.md`](../../references/issue-tracker.md).
|
|
22
|
+
|
|
23
|
+
Without a plan, compare the branch's changes with the issue's requirements. Distinguish implemented behavior from verified behavior; commits alone do not prove completion.
|
|
24
|
+
|
|
25
|
+
## Brief
|
|
26
|
+
|
|
27
|
+
Report in this shape:
|
|
28
|
+
|
|
29
|
+
- **Issue** — one line: id, title, why it exists.
|
|
30
|
+
- **Done** — completed requirements or checked plan tasks, with supporting changes and verification evidence.
|
|
31
|
+
- **Left** — remaining requirements or open plan tasks, missing verification, and any uncommitted work sitting in the tree.
|
|
32
|
+
- **Next** — the single command that advances it, read from where the trail stops:
|
|
33
|
+
- Change request already open → it's in review; nothing to run.
|
|
34
|
+
- Otherwise, work remains or completion is uncertain → `/implement-change` resumes implementation or verification.
|
|
35
|
+
- Work complete and verified, uncommitted diff in the tree → review the diff, then `/commit`.
|
|
36
|
+
- Work complete, verified, and committed, no change request open → `/open-change-request`.
|