@baldurpan/create-ai-workflow 0.4.1 → 0.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 +12 -6
- package/dist/cli.js +2 -2
- package/dist/commands/install.js +3 -3
- package/dist/commands/update.js +1 -1
- package/dist/layout.js +3 -1
- package/package.json +1 -1
- package/templates/blocks/agents-block.md +7 -2
- package/templates/context/README.md +2 -1
- package/templates/context/plan-template.md +3 -2
- package/templates/context/workflow.md +20 -4
- package/templates/skills/feature-close/SKILL.md +6 -1
- package/templates/skills/feature-implement/SKILL.md +16 -3
- package/templates/skills/feature-plan/SKILL.md +4 -0
- package/templates/skills/feature-status/SKILL.md +4 -2
- package/templates/skills/onboard/SKILL.md +38 -10
- package/templates/skills/orchestrate/SKILL.md +11 -3
- package/templates/skills/prototype/SKILL.md +115 -0
- package/templates/stubs/git.md +44 -0
- package/templates/stubs/stack.md +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
npx @baldurpan/create-ai-workflow # or: npm create @baldurpan/ai-workflow
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
You get a backlog, plan documents with phase ledgers, two verification gates, and
|
|
10
|
+
You get a backlog, plan documents with phase ledgers, two verification gates, and eight commands that
|
|
11
11
|
move work between them. Your coding agent runs the commands; you read and hand-edit the files.
|
|
12
12
|
|
|
13
13
|
---
|
|
@@ -39,6 +39,7 @@ starting point — nothing has to be looked up first.
|
|
|
39
39
|
| `/feature-status` | read-only. Reconciles the ledger against the repo, then names **exactly one** next action |
|
|
40
40
|
| `/feature-close` | retires a feature: a `history.md` row, a `git mv` into `archive/`, and a reviewed reference sweep |
|
|
41
41
|
| `/orchestrate` | one ad-hoc, commit-sized change through the same gates — no entry, no ledger |
|
|
42
|
+
| `/prototype` | a throwaway HTML/CSS mockup under `prototypes/`, to settle a layout question before a plan commits to it — no gates, no application code |
|
|
42
43
|
| `/onboard` | fills in your own stubs, adopting what the repo already documented and running each verification command before writing it down |
|
|
43
44
|
|
|
44
45
|
## What makes it different
|
|
@@ -57,6 +58,11 @@ test commands. No skill, agent prompt or role file carries a copy — a hardcode
|
|
|
57
58
|
project changes shape, and a second copy rots faster. `/onboard` **runs each candidate and writes only the
|
|
58
59
|
ones that exit 0.**
|
|
59
60
|
|
|
61
|
+
**Nothing commits unless you said it could.** `context/git.md` holds one answer — the user commits, or
|
|
62
|
+
the agent does — and every command that lands code reads it before closing out. It ships saying *the user
|
|
63
|
+
commits*: a tool installed into a repository it knows nothing about does not get to write that
|
|
64
|
+
repository's history unasked. Branches, pushes and pull requests are outside the workflow entirely.
|
|
65
|
+
|
|
60
66
|
**A finding outlives the session that found it.** A reviewer `FAIL` or a capped gate is written to
|
|
61
67
|
`context/findings.md` *before* the loopback, so it survives the conversation ending. An open `P0`/`P1`
|
|
62
68
|
blocks its phase from being marked `done` and blocks `/feature-close`.
|
|
@@ -66,11 +72,11 @@ blocks its phase from being marked `done` and blocks `/feature-close`.
|
|
|
66
72
|
```
|
|
67
73
|
context/
|
|
68
74
|
README.md workflow.md plan-template.md plan-template.notes.md roles/ standards/ tool-owned
|
|
69
|
-
stack.md verify.md executors.md roadmap.md history.md findings.md
|
|
75
|
+
stack.md verify.md executors.md git.md roadmap.md history.md findings.md yours
|
|
70
76
|
drafts/ plans/ archive/ yours
|
|
71
77
|
.state/manifest.json
|
|
72
|
-
.claude/skills/<
|
|
73
|
-
.agents/skills/<
|
|
78
|
+
.claude/skills/<eight>/SKILL.md .claude/agents/*.agent.md tool-owned
|
|
79
|
+
.agents/skills/<eight>/SKILL.md the same eight bodies, for hosts that read that tree tool-owned
|
|
74
80
|
AGENTS.md a delimited block, merged into whatever is already there
|
|
75
81
|
CLAUDE.md a single @AGENTS.md line, and only when the file does not exist
|
|
76
82
|
```
|
|
@@ -79,7 +85,7 @@ Nothing is committed. Review the diff yourself.
|
|
|
79
85
|
|
|
80
86
|
**Onto a repository that already documents itself**, the installer only appends — your existing
|
|
81
87
|
`AGENTS.md` prose is left exactly where it is. `/onboard` reconciles the two afterwards: it classifies
|
|
82
|
-
each existing claim into `stack.md`, `verify.md` or `executors.md`, asks wherever a destination is
|
|
88
|
+
each existing claim into `stack.md`, `verify.md`, `git.md` or `executors.md`, asks wherever a destination is
|
|
83
89
|
unclear or the old text contradicts the installed workflow, and prunes the source only once the
|
|
84
90
|
replacement is written and shown.
|
|
85
91
|
|
|
@@ -140,7 +146,7 @@ positive points at the document that is out of step.
|
|
|
140
146
|
## Scope
|
|
141
147
|
|
|
142
148
|
**Both skill trees ship.** Claude Code reads `.claude/skills/`; Codex reads `.agents/skills/` and never
|
|
143
|
-
looks at the other one. They get the same
|
|
149
|
+
looks at the other one. They get the same eight bodies — the only difference is one frontmatter line,
|
|
144
150
|
`disable-model-invocation: true`, which is Claude Code's key and means nothing elsewhere. The bodies are
|
|
145
151
|
written runtime-neutral, with no runtime primitive named in any of them, and a test enforces it.
|
|
146
152
|
|
package/dist/cli.js
CHANGED
|
@@ -24,8 +24,8 @@ ${bold('Options')}
|
|
|
24
24
|
${bold('What it installs')}
|
|
25
25
|
context/ the workflow's documents. Tool-owned files are replaced on update; your
|
|
26
26
|
roadmap, plans, findings, stack, verify and executors never are.
|
|
27
|
-
.claude/
|
|
28
|
-
.agents/ the same
|
|
27
|
+
.claude/ eight skills and two subagent definitions, for Claude Code.
|
|
28
|
+
.agents/ the same eight skills, for Codex and anything else reading that tree.
|
|
29
29
|
AGENTS.md a delimited block, merged into whatever is already there.
|
|
30
30
|
CLAUDE.md a single ${cyan('@AGENTS.md')} line, and only if the file does not exist.
|
|
31
31
|
|
package/dist/commands/install.js
CHANGED
|
@@ -34,7 +34,7 @@ export function install(root) {
|
|
|
34
34
|
manifest.managedFiles[file.dest] = hash(content);
|
|
35
35
|
}
|
|
36
36
|
info(`${green('+')} ${managed.length} tool-owned files ${dim('(replaced on update)')}`);
|
|
37
|
-
info(dim(` the
|
|
37
|
+
info(dim(` the eight skills go to ${adapters.map((a) => `${ADAPTER_SKILL_DIRS[a]}/`).join(' and ')} — ` +
|
|
38
38
|
'one body, one directory per host, neither hand-edited'));
|
|
39
39
|
for (const stub of STUBS) {
|
|
40
40
|
write(root, stub.dest, readTemplate(stub.source));
|
|
@@ -70,9 +70,9 @@ export function install(root) {
|
|
|
70
70
|
info();
|
|
71
71
|
info(bold('Next'));
|
|
72
72
|
info(` 1. Review the diff. ${dim('Nothing was committed — that is deliberate.')}`);
|
|
73
|
-
info(` 2. Run ${cyan('/onboard')} in your agent to fill in verify.md, executors.md and stack.md.`);
|
|
73
|
+
info(` 2. Run ${cyan('/onboard')} in your agent to fill in verify.md, executors.md, git.md and stack.md.`);
|
|
74
74
|
if (before !== null) {
|
|
75
|
-
info(dim(' AGENTS.md already said things of its own — /onboard folds those into the
|
|
75
|
+
info(dim(' AGENTS.md already said things of its own — /onboard folds those into the four files\n' +
|
|
76
76
|
' above and prunes what it moved, asking before anything is deleted.'));
|
|
77
77
|
}
|
|
78
78
|
info(` 3. ${cyan('/roadmap "some idea"')} starts the loop.`);
|
package/dist/commands/update.js
CHANGED
|
@@ -128,7 +128,7 @@ export function update(root, options) {
|
|
|
128
128
|
info();
|
|
129
129
|
info(bold('Ownership'));
|
|
130
130
|
info(` ${green('replaced by update')} ${dim('the tool-owned files above — every one is in the manifest')}`);
|
|
131
|
-
info(` ${cyan('yours, untouched')} ${dim('context/stack.md, verify.md, executors.md, roadmap.md,')}`);
|
|
131
|
+
info(` ${cyan('yours, untouched')} ${dim('context/stack.md, verify.md, executors.md, git.md, roadmap.md,')}`);
|
|
132
132
|
info(` ${dim('history.md, findings.md, drafts/, plans/, archive/, CLAUDE.md,')}`);
|
|
133
133
|
info(` ${dim('and anything else you have added under context/')}`);
|
|
134
134
|
info(dim(' A project-owned file is not in the manifest, so no code path here reaches it.'));
|
package/dist/layout.js
CHANGED
|
@@ -28,6 +28,7 @@ export const SKILL_NAMES = [
|
|
|
28
28
|
'feature-status',
|
|
29
29
|
'feature-close',
|
|
30
30
|
'orchestrate',
|
|
31
|
+
'prototype',
|
|
31
32
|
'onboard',
|
|
32
33
|
];
|
|
33
34
|
/**
|
|
@@ -79,7 +80,7 @@ export function managedFiles(adapters) {
|
|
|
79
80
|
files.push({ source: `claude/agents/${posix}`, dest: `.claude/agents/${posix}` });
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
|
-
// The same
|
|
83
|
+
// The same eight bodies, verbatim. No transform: `disable-model-invocation` is Claude Code's key and
|
|
83
84
|
// means nothing here, and there is no subagent tree to go with it — the skills already write
|
|
84
85
|
// delegation as optional.
|
|
85
86
|
if (adapters.includes('agents')) {
|
|
@@ -97,6 +98,7 @@ export const STUBS = [
|
|
|
97
98
|
{ source: 'stubs/stack.md', dest: 'context/stack.md' },
|
|
98
99
|
{ source: 'stubs/verify.md', dest: 'context/verify.md' },
|
|
99
100
|
{ source: 'stubs/executors.md', dest: 'context/executors.md' },
|
|
101
|
+
{ source: 'stubs/git.md', dest: 'context/git.md' },
|
|
100
102
|
{ source: 'stubs/roadmap.md', dest: 'context/roadmap.md' },
|
|
101
103
|
{ source: 'stubs/history.md', dest: 'context/history.md' },
|
|
102
104
|
{ source: 'stubs/findings.md', dest: 'context/findings.md' },
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@baldurpan/create-ai-workflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Overlay a tiered planning workflow — roadmap, plans, phase ledgers, verification gates — onto an existing repository, for coding agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -12,17 +12,22 @@ the standing rules, and every command cites it rather than restating it.
|
|
|
12
12
|
| `/feature-status` | read-only "where do things stand". **Never a prerequisite** for anything |
|
|
13
13
|
| `/feature-close` | retires a finished or abandoned feature into `context/archive/` |
|
|
14
14
|
| `/orchestrate` | one ad-hoc, gated, commit-sized change — no roadmap entry, no ledger |
|
|
15
|
-
| `/
|
|
15
|
+
| `/prototype` | a throwaway HTML/CSS mockup under `prototypes/` — no gates, no ledger, no application code |
|
|
16
|
+
| `/onboard` | fills in this project's own stubs — `verify.md`, `executors.md`, `git.md`, `stack.md` — adopting what an existing `AGENTS.md` already said |
|
|
16
17
|
|
|
17
18
|
| Read | For |
|
|
18
19
|
|---|---|
|
|
19
20
|
| [`context/stack.md`](context/stack.md) | runtime, layout, conventions |
|
|
20
21
|
| [`context/standards/README.md`](context/standards/README.md) | engineering standards — load per its conditional table |
|
|
21
22
|
| [`context/verify.md`](context/verify.md) | the real lint / typecheck / build / test commands — the only file that names one |
|
|
23
|
+
| [`context/git.md`](context/git.md) | who commits, and at what granularity — read it before closing out any change |
|
|
22
24
|
|
|
23
25
|
**Phase status lives in the active plan's status ledger and nowhere else.** Work the lowest-numbered phase
|
|
24
26
|
that is not `done` and whose `Depends on` are all `done`; state which you picked before starting; update
|
|
25
|
-
the row
|
|
27
|
+
the row as part of the same change as the work. **If the ledger disagrees with the repo, stop and say so.**
|
|
28
|
+
|
|
29
|
+
**Nothing commits unless [`context/git.md`](context/git.md) says so.** Absent or silent, the work is left in
|
|
30
|
+
the working tree and the user commits it.
|
|
26
31
|
|
|
27
32
|
**An open `P0` or `P1` in [`context/findings.md`](context/findings.md) blocks its phase from being `done`.**
|
|
28
33
|
|
|
@@ -35,6 +35,7 @@ generated "current state" file — hand-editing a ledger row changes every comma
|
|
|
35
35
|
| [`stack.md`](stack.md) | this project's runtime, layout, conventions, and an index of your own files | project |
|
|
36
36
|
| [`verify.md`](verify.md) | this project's real lint / typecheck / build / test commands | project |
|
|
37
37
|
| [`executors.md`](executors.md) | how this project dispatches a coder and a reviewer | project |
|
|
38
|
+
| [`git.md`](git.md) | who commits the work an agent produces, and at what granularity | project |
|
|
38
39
|
| [`roadmap.md`](roadmap.md) | Tier 1 — the backlog. `pending` and `active` entries only | project |
|
|
39
40
|
| [`history.md`](history.md) | index of retired features, newest last | project |
|
|
40
41
|
| [`findings.md`](findings.md) | open findings that gate a phase from being marked `done` | project |
|
|
@@ -64,7 +65,7 @@ hash, `update` walks that manifest, and a project-owned file is not in it — so
|
|
|
64
65
|
|
|
65
66
|
| Tool-owned — replaced on `update` | Project-owned — unreachable by the updater |
|
|
66
67
|
|---|---|
|
|
67
|
-
| `README.md`, `workflow.md`, `plan-template*.md`, `roles/` | `stack.md`, `verify.md`, `executors.md` |
|
|
68
|
+
| `README.md`, `workflow.md`, `plan-template*.md`, `roles/` | `stack.md`, `verify.md`, `executors.md`, `git.md` |
|
|
68
69
|
| the skill and agent trees, the `AGENTS.md` block | `roadmap.md`, `history.md`, `findings.md` |
|
|
69
70
|
| `standards/` while it is ours and unmodified | `drafts/`, `plans/`, `archive/`, `CLAUDE.md` |
|
|
70
71
|
|
|
@@ -36,8 +36,9 @@ Written <YYYY-MM-DD>. <One line on what this is.> The `<name>` entry in
|
|
|
36
36
|
| 1 | <name> | not started | — | |
|
|
37
37
|
| 2 | <name> | not started | 1 | |
|
|
38
38
|
|
|
39
|
-
Status is one of `not started`, `in progress`, `blocked`, `done`. `done` only when
|
|
40
|
-
and whoever finishes a phase updates the row
|
|
39
|
+
Status is one of `not started`, `in progress`, `blocked`, `done`. `done` only when the scope landed and both
|
|
40
|
+
gates passed, and whoever finishes a phase updates the row as part of the same change as the work — who
|
|
41
|
+
commits that change is [`../git.md`](../git.md)'s answer, not this table's.
|
|
41
42
|
|
|
42
43
|
**Exactly one table in this document has these columns.** Do not add a second phase table — a
|
|
43
44
|
differently-shaped one nearby is a decoy that gets read by mistake.
|
|
@@ -20,7 +20,7 @@ running something else.
|
|
|
20
20
|
| Tier 1 → a plan | `/feature-plan` |
|
|
21
21
|
| a plan → being worked, then phase by phase | `/feature-implement` |
|
|
22
22
|
| Tier 2 → retired | `/feature-close` |
|
|
23
|
-
| no tier crossed | `/orchestrate` — one ad-hoc gated change; `/feature-status` — read-only |
|
|
23
|
+
| no tier crossed | `/orchestrate` — one ad-hoc gated change; `/feature-status` — read-only; `/prototype` — a throwaway mockup |
|
|
24
24
|
|
|
25
25
|
**Every command finds its own starting point.** Nothing has to be looked up first, and `/feature-status` is
|
|
26
26
|
never a prerequisite for anything.
|
|
@@ -35,7 +35,8 @@ never a prerequisite for anything.
|
|
|
35
35
|
| `/feature-status` | nothing — read-only | — |
|
|
36
36
|
| `/feature-close` | Tier 2 → retired | `history.md`, `archive/`, the reference sweep |
|
|
37
37
|
| `/orchestrate` | one ad-hoc gated change | the code, and `findings.md` |
|
|
38
|
-
| `/
|
|
38
|
+
| `/prototype` | one throwaway HTML/CSS mockup — no gates, no application code | `prototypes/<NAME>/`, and nothing else |
|
|
39
|
+
| `/onboard` | the project-owned stubs | `verify.md`, `executors.md`, `git.md`, `stack.md`, and the pruning of what they replace |
|
|
39
40
|
|
|
40
41
|
## One source of truth per fact
|
|
41
42
|
|
|
@@ -85,6 +86,16 @@ features may hold plans at once, and that is what makes planning ahead possible.
|
|
|
85
86
|
`/orchestrate` is the ad-hoc escape hatch, not the way to skip planning. It refuses anything larger than a
|
|
86
87
|
commit-sized unit and anything an existing roadmap entry already covers.
|
|
87
88
|
|
|
89
|
+
### Nothing commits unless `git.md` says so
|
|
90
|
+
|
|
91
|
+
> **Read [`git.md`](git.md) before closing out any command that lands code. If it does not exist, or does
|
|
92
|
+
> not say the agent commits, the work is left in the working tree and the user commits it.**
|
|
93
|
+
|
|
94
|
+
This workflow has always described phases as commit-sized and `done` as landed — which an agent, given no
|
|
95
|
+
policy, resolves by committing on its own every phase. That is a call about someone else's repository, so
|
|
96
|
+
it is a written answer rather than an inference. Branching and pushing are outside it: nothing here creates
|
|
97
|
+
a branch, pushes, or opens a pull request under either answer.
|
|
98
|
+
|
|
88
99
|
### Never transcribe a credential
|
|
89
100
|
|
|
90
101
|
> **A DSN, token or key is described and pointed at the secret store, never copied into a tracked file.**
|
|
@@ -114,10 +125,15 @@ To pick the next phase: take the **lowest-numbered phase that is not `done` and
|
|
|
114
125
|
are all `done`.** State which one you picked before starting. If it is already `in progress`, read its Note
|
|
115
126
|
and resume — do not restart it.
|
|
116
127
|
|
|
117
|
-
`done` means
|
|
128
|
+
`done` means the phase's scope landed and both gates passed — **a verdict about the gates, not about git.**
|
|
129
|
+
Whoever finishes a phase updates its row **as part of the same change as the work**: one commit where the
|
|
130
|
+
agent commits, one working tree handed over where the user does. A row updated separately is a row that
|
|
131
|
+
disagrees with the repository in between.
|
|
118
132
|
|
|
119
133
|
If the ledger's claim disagrees with the repo — a phase marked `done` whose files do not exist, or the
|
|
120
|
-
reverse — **stop and say so.** Never silently re-do or skip a phase on a stale ledger.
|
|
134
|
+
reverse — **stop and say so.** Never silently re-do or skip a phase on a stale ledger. A `done` row whose
|
|
135
|
+
change is still uncommitted is not that: under the default policy in [`git.md`](git.md) it is the normal
|
|
136
|
+
end state.
|
|
121
137
|
|
|
122
138
|
## The gates
|
|
123
139
|
|
|
@@ -79,6 +79,11 @@ grep -rn "<old-path>\|<OLD-FILENAME>" --include='*.md' . | grep -v node_modules
|
|
|
79
79
|
Move every **closed** finding tied to this feature out of `context/findings.md` and into the archived plan's
|
|
80
80
|
own log. `findings.md` must not grow for the life of the project.
|
|
81
81
|
|
|
82
|
+
Then read [`context/git.md`](../../../context/git.md) before committing anything. `git mv` stages a rename
|
|
83
|
+
and writes no history, so it is safe under either answer — but the commit that carries it is the agent's to
|
|
84
|
+
make only where that file says so. If it does not exist, the answer is *the user commits*: show the whole
|
|
85
|
+
retirement as one reviewable change and hand it over.
|
|
86
|
+
|
|
82
87
|
## Mode 2 — `--dropped`
|
|
83
88
|
|
|
84
89
|
For an entry that will not be built. **There is no ledger check in this mode** — unfinished phases are
|
|
@@ -97,6 +102,6 @@ expected.
|
|
|
97
102
|
- **Never delete a plan document.** Archiving keeps the reasoning; deleting throws away the record of a
|
|
98
103
|
decision someone will otherwise re-litigate.
|
|
99
104
|
- **Never leave `roadmap.md` and `history.md` inconsistent.** An entry is in exactly one of them.
|
|
100
|
-
- **Never commit the sweep unreviewed
|
|
105
|
+
- **Never commit the sweep unreviewed** — and never commit it at all unless `git.md` says the agent commits.
|
|
101
106
|
- **Never mark a phase `done` to get past the refusal.** If phases are unfinished, the feature is
|
|
102
107
|
unfinished.
|
|
@@ -120,7 +120,7 @@ blocked by definition), then escalate to the user with the current state and the
|
|
|
120
120
|
|
|
121
121
|
## 10. Close out the ledger row
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
The row is part of the same change as the work — never a separate step afterwards:
|
|
124
124
|
|
|
125
125
|
- **All of the phase's scope landed and both gates passed** → `done`.
|
|
126
126
|
- **Some landed** → stays `in progress`, Note rewritten to name exactly what remains.
|
|
@@ -129,9 +129,22 @@ In the same commit as the work:
|
|
|
129
129
|
**Never mark `done` on a coder's self-report** — the gate output is the evidence. **Refuse `done` while an
|
|
130
130
|
open `P0` or `P1` is tied to this phase**; leave it `in progress` and name the finding.
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
`done` is a verdict about the gates, not about git. Whether the change is committed at all is the next step.
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
## 11. Land it — read [`context/git.md`](../../../context/git.md)
|
|
135
|
+
|
|
136
|
+
**Do not commit until you have read that file, and do not commit at all unless it says the agent does.**
|
|
137
|
+
It is the only place this project's answer lives, the same way `verify.md` is the only place its commands
|
|
138
|
+
live. If it does not exist — an install from before it shipped — the answer is *the user commits*: say so
|
|
139
|
+
once, and name `/onboard`.
|
|
140
|
+
|
|
141
|
+
- **The user commits** → leave the change in the working tree, ledger row and all. Report it, hand it over,
|
|
142
|
+
and stop. Do not stage-and-commit "to be helpful", and do not push or branch under either answer.
|
|
143
|
+
- **The agent commits** → the code and the ledger row in one commit, at the granularity that file names.
|
|
144
|
+
|
|
145
|
+
## 12. Report
|
|
146
|
+
|
|
147
|
+
- What changed, and which files — and whether it is committed or waiting in the tree.
|
|
135
148
|
- Gate 1 output, and Gate 2's verdict.
|
|
136
149
|
- Loopback counts, if any.
|
|
137
150
|
- Findings written or closed, by id.
|
|
@@ -89,6 +89,10 @@ inline. Either way the brief is the same, and the output contract is the templat
|
|
|
89
89
|
planner's own default shape:
|
|
90
90
|
|
|
91
91
|
- The roadmap entry verbatim, and the full content of its draft if there was one.
|
|
92
|
+
- **If `prototypes/<NAME>/` exists at the repository root**, its `NOTES.md` and the mockups beside it. A
|
|
93
|
+
sketch someone has already looked at settles a design question that a paragraph would only argue. Carry
|
|
94
|
+
what it settled into §4 Design and cite the folder; treat anything it marked invented as a proposal, not
|
|
95
|
+
a fact. **No folder, no step** — this is a conditional read, not a prerequisite.
|
|
92
96
|
- **The full section list from `context/plan-template.md`, stated as required output**, in order, with the
|
|
93
97
|
ledger's exact column set. A general-purpose planner will otherwise emit implementation-steps-and-
|
|
94
98
|
acceptance-criteria — a per-phase artifact, not a plan — and you will throw it away.
|
|
@@ -40,8 +40,10 @@ stale. That is the exact failure this workflow exists to prevent.
|
|
|
40
40
|
|
|
41
41
|
- Every phase `done` while the entry still reads `active` — that is the normal state before
|
|
42
42
|
`/feature-close`. Next action 5 handles it.
|
|
43
|
-
- A `done` row with its changes still in the working tree
|
|
44
|
-
the
|
|
43
|
+
- A `done` row with its changes still in the working tree. Under the default policy in
|
|
44
|
+
[`context/git.md`](../../../context/git.md) that is the normal end state of a phase, not a discrepancy —
|
|
45
|
+
the user commits. Name it in the report; do not stop on it, and do not commit it: this command writes
|
|
46
|
+
nothing.
|
|
45
47
|
|
|
46
48
|
## 3. Report
|
|
47
49
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: onboard
|
|
3
|
-
description: "Fill in this project's own workflow stubs — context/verify.md, context/executors.md and context/stack.md — by adopting what the repository already documented, asking wherever a claim's destination is unclear, and running each candidate verification command so only the ones that pass are written down. Explicit invocation only — run this when the user types /onboard. Do NOT match on 'set up the project', 'get started', or general setup requests."
|
|
3
|
+
description: "Fill in this project's own workflow stubs — context/verify.md, context/executors.md, context/git.md and context/stack.md — by adopting what the repository already documented, asking wherever a claim's destination is unclear, and running each candidate verification command so only the ones that pass are written down. Explicit invocation only — run this when the user types /onboard. Do NOT match on 'set up the project', 'get started', or general setup requests."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /onboard
|
|
@@ -21,8 +21,9 @@ Read [`context/workflow.md`](../../../context/workflow.md) for the tier model.
|
|
|
21
21
|
|---|---|
|
|
22
22
|
| [`context/verify.md`](../../../context/verify.md) | the real Lint / Typecheck / Build / Test commands — **only ones that exited 0** |
|
|
23
23
|
| [`context/executors.md`](../../../context/executors.md) | how this project dispatches a coder and a reviewer |
|
|
24
|
+
| [`context/git.md`](../../../context/git.md) | who commits the work, and at what granularity |
|
|
24
25
|
| [`context/stack.md`](../../../context/stack.md) | runtime, layout, conventions |
|
|
25
|
-
| [`AGENTS.md`](../../../AGENTS.md) | pruned, on confirmation, of what moved into those
|
|
26
|
+
| [`AGENTS.md`](../../../AGENTS.md) | pruned, on confirmation, of what moved into those four. The region between the `ai-workflow` markers is never touched |
|
|
26
27
|
|
|
27
28
|
Show every proposed edit before writing it, and **do not commit.** The user reviews and commits.
|
|
28
29
|
|
|
@@ -44,8 +45,9 @@ Break what you read into claims — a paragraph, a table row, a bullet — and p
|
|
|
44
45
|
| A claim about | Goes to |
|
|
45
46
|
|---|---|
|
|
46
47
|
| what the project is, its layout, its conventions | `context/stack.md` |
|
|
47
|
-
| a lint, typecheck, build or test command | a **candidate** for `context/verify.md` — Step
|
|
48
|
+
| a lint, typecheck, build or test command | a **candidate** for `context/verify.md` — Step 6 still has to run it |
|
|
48
49
|
| how a coder or a reviewer is dispatched | `context/executors.md` |
|
|
50
|
+
| a rule about who commits, or when work is committed | `context/git.md` |
|
|
49
51
|
| a rule the bundled standards already state | nowhere — the standards own it. Ask before dropping |
|
|
50
52
|
| planning or review process this workflow now owns | nowhere — superseded. Ask before dropping |
|
|
51
53
|
| anything else — ownership, contacts, external links | stays in `AGENTS.md`, outside the block |
|
|
@@ -63,7 +65,7 @@ destination. Two kinds of row are never decided alone:
|
|
|
63
65
|
An adopted claim is an *input* to the steps below, not a substitute for them. A command lifted out of the
|
|
64
66
|
old file is a candidate like any other and still has to run.
|
|
65
67
|
|
|
66
|
-
**Nothing is deleted here.** Pruning is Step
|
|
68
|
+
**Nothing is deleted here.** Pruning is Step 8, after the destination files exist.
|
|
67
69
|
|
|
68
70
|
On a re-run, a claim its destination file already states is already adopted. Say so in a line and move on.
|
|
69
71
|
|
|
@@ -87,7 +89,7 @@ on that being true, and it is true of some executors and not others.
|
|
|
87
89
|
4. If it comes back empty, guessed, or refused, record that **this executor needs content inline** — the
|
|
88
90
|
one case where a brief carries file contents instead of paths.
|
|
89
91
|
|
|
90
|
-
Never write down an invocation you have not run. This is the same rule as Step
|
|
92
|
+
Never write down an invocation you have not run. This is the same rule as Step 6, for the same reason.
|
|
91
93
|
|
|
92
94
|
## Step 3 — Reviewer dispatch
|
|
93
95
|
|
|
@@ -107,7 +109,33 @@ winner: it differs per host and changes underneath you. What ships is the contra
|
|
|
107
109
|
Whatever is chosen, that contract stands: a review happens, every blocking finding carries a `P0`–`P3`
|
|
108
110
|
severity, and a `FAIL` writes a finding before the loopback.
|
|
109
111
|
|
|
110
|
-
## Step 4 —
|
|
112
|
+
## Step 4 — Who commits
|
|
113
|
+
|
|
114
|
+
**Ask this one. It is the question the workflow used to answer by inference.**
|
|
115
|
+
|
|
116
|
+
Every command that lands code closes out by updating a ledger row *as part of the same change as the work*,
|
|
117
|
+
and `done` has always meant the scope landed and the gates passed. Given no policy, an agent resolves that
|
|
118
|
+
the only way it can — by committing, every phase, in someone else's repository. That is a call for the
|
|
119
|
+
project to make, so ask it and write the answer to [`context/git.md`](../../../context/git.md).
|
|
120
|
+
|
|
121
|
+
Ask, using your runtime's question mechanism if it has one:
|
|
122
|
+
|
|
123
|
+
- **The user commits** — the default, and what the stub ships saying. A phase ends verified, with its
|
|
124
|
+
ledger row updated, left in the working tree. The agent reports and stops.
|
|
125
|
+
- **The agent commits** — one commit per phase, the code and its ledger row together.
|
|
126
|
+
|
|
127
|
+
Then confirm the granularity if the agent commits, and **say plainly what is not being decided**: nothing in
|
|
128
|
+
this workflow branches, pushes, or opens a pull request under either answer, and choosing one does not start
|
|
129
|
+
that.
|
|
130
|
+
|
|
131
|
+
Write the answer as the surviving line under **Who commits**, and delete the other. If `context/git.md` does
|
|
132
|
+
not exist — an install from before it shipped — create it, with a `## Who commits` section holding the
|
|
133
|
+
chosen line, a `## Granularity` section, and a line recording that branches and pushes are out of scope.
|
|
134
|
+
|
|
135
|
+
If Step 1 turned up an existing rule about committing, quote it here and let it win unless the user says
|
|
136
|
+
otherwise. Prose someone wrote about their own repository beats a default.
|
|
137
|
+
|
|
138
|
+
## Step 5 — Standards source
|
|
111
139
|
|
|
112
140
|
`context/standards/` ships with a bundled default. Ask whether that is right for this project.
|
|
113
141
|
|
|
@@ -121,7 +149,7 @@ Say plainly what the default is and that a wrong set is not inert — agents loa
|
|
|
121
149
|
conditional table unprompted, on every task. If Step 1 turned up house rules that the bundled set already
|
|
122
150
|
covers, this is the moment that matters: keeping both means the project has two answers.
|
|
123
151
|
|
|
124
|
-
## Step
|
|
152
|
+
## Step 6 — Verification commands
|
|
125
153
|
|
|
126
154
|
**This is the most valuable step in this command.** Do it properly.
|
|
127
155
|
|
|
@@ -143,7 +171,7 @@ covers, this is the moment that matters: keeping both means the project has two
|
|
|
143
171
|
Explain what you are doing: this turns `verify.md` from someone's guess into something verified at install
|
|
144
172
|
time, which is the one moment it is cheap to catch.
|
|
145
173
|
|
|
146
|
-
## Step
|
|
174
|
+
## Step 7 — Stack
|
|
147
175
|
|
|
148
176
|
Start from what Step 1 routed here, show it back as a draft, and ask only for the gaps:
|
|
149
177
|
|
|
@@ -158,9 +186,9 @@ Start from what Step 1 routed here, show it back as a draft, and ask only for th
|
|
|
158
186
|
Point out that anything else added under `context/` should be indexed in `stack.md`, not in
|
|
159
187
|
`context/README.md`, which is tool-owned and replaced on update.
|
|
160
188
|
|
|
161
|
-
## Step
|
|
189
|
+
## Step 8 — Prune the sources
|
|
162
190
|
|
|
163
|
-
Only now, with the
|
|
191
|
+
Only now, with the four stubs written, remove from `AGENTS.md` and `CLAUDE.md` what has landed elsewhere.
|
|
164
192
|
Duplication left standing is the failure this step exists to prevent: two statements of one fact drift, and
|
|
165
193
|
the stale copy is indistinguishable from the live one.
|
|
166
194
|
|
|
@@ -79,10 +79,18 @@ expand no scope.
|
|
|
79
79
|
At the cap: write a finding (`P1` for a Gate 1 cap-out), then escalate with the current state and the last
|
|
80
80
|
feedback. **Escalating is not a substitute for recording.**
|
|
81
81
|
|
|
82
|
-
## 6.
|
|
82
|
+
## 6. Land it — read [`context/git.md`](../../../context/git.md)
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
**Do not commit unless that file says the agent does.** If it does not exist, the answer is *the user
|
|
85
|
+
commits*: say so once, and name `/onboard`. Nothing branches or pushes under either answer.
|
|
86
|
+
|
|
87
|
+
- **The user commits** → leave the change in the working tree and hand it over.
|
|
88
|
+
- **The agent commits** → one commit, at the granularity that file names.
|
|
89
|
+
|
|
90
|
+
## 7. Report
|
|
91
|
+
|
|
92
|
+
What changed, whether it is committed or waiting in the tree, the Gate 1 output, the Gate 2 verdict, any
|
|
93
|
+
loopbacks, and any findings written, closed or swept — by id.
|
|
86
94
|
|
|
87
95
|
## Rules
|
|
88
96
|
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prototype
|
|
3
|
+
description: "Mock one screen or interaction as throwaway HTML and CSS under prototypes/, to settle a layout or look-and-feel question before a plan commits to it. Writes no application code and runs no gates. Explicit invocation only — run this when the user types /prototype. Do NOT match on 'mock this up', 'try a layout', 'what should this look like', or any request to build, style or restyle real UI."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /prototype
|
|
7
|
+
|
|
8
|
+
A cheap, disposable sketch of something that will be built properly later. **No roadmap entry, no ledger,
|
|
9
|
+
no gates, no tier boundary crossed** — and no application source is touched.
|
|
10
|
+
|
|
11
|
+
It exists because some questions are only answerable by looking at the thing. Arguing about a layout in a
|
|
12
|
+
plan document is slow and inconclusive; two static files answer it in minutes, and the answer then goes
|
|
13
|
+
into the plan as a decision rather than a paragraph of hedging. **Nothing in the workflow requires this
|
|
14
|
+
command** — skip it and every other command behaves identically.
|
|
15
|
+
|
|
16
|
+
Read [`context/workflow.md`](../../../context/workflow.md) for the tier model and the feature/task rule.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/prototype "<what to mock>" # a screen, a flow, an interaction
|
|
22
|
+
/prototype "<entry name>" # mock what a roadmap entry describes
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 0. Refuse, before anything else
|
|
26
|
+
|
|
27
|
+
1. **Refuse to build the real thing.** This command produces throwaway files outside the application. The
|
|
28
|
+
moment the request is "now wire it up" or "put this in the app", it belongs to `/orchestrate` if it is
|
|
29
|
+
commit-sized, or to `/feature-plan` and `/feature-implement` if it is a feature. Name the one that
|
|
30
|
+
applies and stop.
|
|
31
|
+
2. **Refuse to sketch the whole application.** A screen or two, chosen because something about them is
|
|
32
|
+
actually in question. If the answer is "all of them", ask which decision is being made and mock the two
|
|
33
|
+
screens that decide it.
|
|
34
|
+
|
|
35
|
+
Say which question the mockup exists to answer, in one line, before writing anything.
|
|
36
|
+
|
|
37
|
+
## 1. Read what this project already looks like
|
|
38
|
+
|
|
39
|
+
**Borrow before inventing.** This repository exists already, so most of the look is decided — and a mockup
|
|
40
|
+
built from values the project does not have is a picture of an app nobody is going to build.
|
|
41
|
+
|
|
42
|
+
Read `context/stack.md`, then find the real thing: the stylesheet or token file, the design system or
|
|
43
|
+
component library, and two or three existing screens close to what is being mocked. Copy the actual token
|
|
44
|
+
names, spacing scale, radii and type stack out of them.
|
|
45
|
+
|
|
46
|
+
Invent only where there is genuinely nothing to borrow — a new surface, or a project with no styling of its
|
|
47
|
+
own yet. **Mark every invented value**, so the plan that reads this knows which parts are proposals and
|
|
48
|
+
which are already true.
|
|
49
|
+
|
|
50
|
+
## 2. Agree the sketch, then stop
|
|
51
|
+
|
|
52
|
+
Ask a short set of questions — which screens, which states, and what specifically is undecided. Use your
|
|
53
|
+
runtime's question mechanism if it has one, or a plain numbered question if it does not.
|
|
54
|
+
|
|
55
|
+
Then propose, and **wait**:
|
|
56
|
+
|
|
57
|
+
- the screens, one line each on what each one shows,
|
|
58
|
+
- the states each will exercise, and
|
|
59
|
+
- which values are borrowed and which are invented.
|
|
60
|
+
|
|
61
|
+
**Write nothing until the user approves.** Adjust the proposal if they push back. Generating five files
|
|
62
|
+
before anyone has agreed what is being asked is how a fast tool becomes a slow one.
|
|
63
|
+
|
|
64
|
+
## 3. Write the mockups
|
|
65
|
+
|
|
66
|
+
Everything goes under `prototypes/<NAME>/` at the repository root, where `<NAME>` is the kebab-case subject
|
|
67
|
+
— matching the roadmap entry's name when there is one.
|
|
68
|
+
|
|
69
|
+
| File | Holds |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `theme.css` | every value the mockups use, in one place — the project's real tokens copied in, and invented ones marked with a comment |
|
|
72
|
+
| `<screen>.html` | one self-contained page per screen, linking `theme.css` |
|
|
73
|
+
| `NOTES.md` | the question this exists to answer, what it settled, what is still open, and which values were invented |
|
|
74
|
+
|
|
75
|
+
- **Plain HTML and CSS. No framework, no build step, no dependencies.** A few lines of inline script for a
|
|
76
|
+
view toggle is fine; anything more means this stopped being a sketch.
|
|
77
|
+
- **Every colour, font and spacing value comes from a `theme.css` variable**, never hard-coded — that is
|
|
78
|
+
what makes tweaking one file restyle every screen at once.
|
|
79
|
+
- **Realistic content and the states that matter** — the empty list, the error, the mid-action moment, the
|
|
80
|
+
name that is too long. An empty shell full of lorem ipsum answers nothing. Desktop-first is enough unless
|
|
81
|
+
the question is about small screens.
|
|
82
|
+
- Never transcribe a credential. Placeholder content is invented, and a real key is never realistic detail.
|
|
83
|
+
|
|
84
|
+
`NOTES.md` is the durable part. The HTML is scaffolding for a conversation; the notes are what a plan reads.
|
|
85
|
+
|
|
86
|
+
## 4. It gets committed
|
|
87
|
+
|
|
88
|
+
`prototypes/` is yours, not the tool's — nothing installs it, nothing updates it, nothing validates it.
|
|
89
|
+
**It gets committed anyway.** Until a plan absorbs `NOTES.md` its conclusions live nowhere else, and neither
|
|
90
|
+
the notes nor the mockups survive a cleared context or a second machine if they were never tracked.
|
|
91
|
+
|
|
92
|
+
Who does the committing is [`context/git.md`](../../../context/git.md)'s answer, not this command's. Where
|
|
93
|
+
the user commits, say plainly that these files are worth tracking rather than leaving them to be mistaken
|
|
94
|
+
for scratch output.
|
|
95
|
+
|
|
96
|
+
## 5. Hand off and stop
|
|
97
|
+
|
|
98
|
+
Report the folder path, and tell the user to open the files in a browser and iterate on the look — that
|
|
99
|
+
iteration is the point, and it costs nothing.
|
|
100
|
+
|
|
101
|
+
Then name exactly one next step, and **do not run it**:
|
|
102
|
+
|
|
103
|
+
- **No roadmap entry yet** → `/roadmap "<idea>"`, citing `prototypes/<NAME>/`.
|
|
104
|
+
- **An entry exists** → `/feature-plan "<NAME>"`, which reads the folder and carries what it settled into
|
|
105
|
+
the plan's Design section.
|
|
106
|
+
|
|
107
|
+
## Rules
|
|
108
|
+
|
|
109
|
+
- **Nothing outside `prototypes/` is written.** Not application source, not `context/`, not `roadmap.md`.
|
|
110
|
+
This command creates no entry, marks nothing active, and touches no ledger row.
|
|
111
|
+
- **No gates.** Nothing here is verified or reviewed, because there is nothing to verify — no test covers
|
|
112
|
+
a throwaway file, and review time spent on one is time wasted. Work that needs a gate is not a mockup.
|
|
113
|
+
- **Throwaway means throwaway.** When the feature ships, delete `prototypes/<NAME>/` and the citation that
|
|
114
|
+
pointed at it. A mockup that no longer matches the app is worse than no mockup, because someone will
|
|
115
|
+
believe it.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Git
|
|
2
|
+
|
|
3
|
+
Who commits the work an agent produces, and at what granularity. **Every command that lands code reads this
|
|
4
|
+
file before it closes out** — the exact parallel to [`verify.md`](verify.md) for commands and
|
|
5
|
+
[`executors.md`](executors.md) for dispatch, and for the same reason: git etiquette differs per repository,
|
|
6
|
+
and a skill that assumes one project's ships one project's habits everywhere.
|
|
7
|
+
|
|
8
|
+
Two answers, and the file is short on purpose. Run `/onboard` to set them, or edit them here.
|
|
9
|
+
|
|
10
|
+
## Who commits
|
|
11
|
+
|
|
12
|
+
<!-- Exactly one of the two answers below is this project's. Keep it, delete the other.
|
|
13
|
+
|
|
14
|
+
Shipped as: the user commits. A tool installed into a repository it knows nothing about does not get
|
|
15
|
+
to write that repository's history unasked. -->
|
|
16
|
+
|
|
17
|
+
**The user commits.** A phase ends with the work verified and its ledger row updated, left in the working
|
|
18
|
+
tree. The agent reports what changed and stops there — no `git commit`, no `git push`, nothing that
|
|
19
|
+
rewrites history.
|
|
20
|
+
|
|
21
|
+
<!-- **The agent commits.** A phase ends committed: the code and its ledger row in one commit, so the two
|
|
22
|
+
cannot disagree. Nothing is pushed either way. -->
|
|
23
|
+
|
|
24
|
+
## Granularity
|
|
25
|
+
|
|
26
|
+
**One commit per phase.** A phase is a commit-sized unit with one checkable outcome — that is what a plan's
|
|
27
|
+
ledger is a list of. Where the user commits, this describes the shape the agent leaves the tree in, not
|
|
28
|
+
something it carries out.
|
|
29
|
+
|
|
30
|
+
## What this file does not decide
|
|
31
|
+
|
|
32
|
+
**Branches, pushes and pull requests.** Nothing in this workflow creates a branch, pushes, or opens a pull
|
|
33
|
+
request, and neither answer above makes it start. If work here belongs on a branch, make the branch before
|
|
34
|
+
the phase starts.
|
|
35
|
+
|
|
36
|
+
## The rules that hold either way
|
|
37
|
+
|
|
38
|
+
- **The ledger row lands with the work.** Whoever makes the commit, the row and the code it describes are
|
|
39
|
+
one change. A row updated separately is a row that disagrees with the repository in between.
|
|
40
|
+
- **`done` is a verdict about the gates, not about git.** A phase is `done` when its scope landed and both
|
|
41
|
+
gates passed. Where the user commits, a `done` row whose change is still in the working tree is the
|
|
42
|
+
normal end state — not a discrepancy, and nothing stops on it.
|
|
43
|
+
- **If this file is missing, the answer is the first one.** An install from before this file existed has
|
|
44
|
+
no policy written down; treat it as *the user commits*, say so once, and name `/onboard`.
|
package/templates/stubs/stack.md
CHANGED
|
@@ -32,4 +32,4 @@ What this project is, and what an agent has to know before touching it. Run `/on
|
|
|
32
32
|
line lost. -->
|
|
33
33
|
|
|
34
34
|
Verification commands are in [`verify.md`](verify.md), not here. Executor dispatch is in
|
|
35
|
-
[`executors.md`](executors.md).
|
|
35
|
+
[`executors.md`](executors.md), and who commits is in [`git.md`](git.md).
|